小弟想ping一些IP,所以按帖子寫了個測試腳本,想將ping得通和不通得分成兩個檔,但語法判斷上好像有錯??
如圖172.16.4.181不通,182、183是通的
但出來的檔案是:
想請教各位大大,是錯在哪了
2025,我只用python
import subprocess
def ping_and_log(ip_address, log_file):
try:
# 執行 ping 命令
result = subprocess.run(
["ping", ip_address, "-n", "4"], # "-n 4" 是 Windows 的 Ping 參數,表示發送 4 個數據包
capture_output=True, text=True
)
# 將輸出追加寫入到 log 文件
with open(log_file, "a") as file:
file.write(result.stdout)
file.write("\n") # 添加換行符
except Exception as e:
print(f"發生錯誤: {e}")
# 使用範例
ping_and_log("192.168.99.1", "pinglog.txt")
開玩笑的啦,powershell更簡單(把以下程式以副檔名ps1存檔)
# 定義IP地址和Log文件
$ipAddress = "192.168.99.1"
$logFile = "pinglog.txt"
# 執行Ping命令
$pResult = Test-Connection -ComputerName $ipAddress -Count 4 -ErrorAction SilentlyContinue
# 檢查Ping是否成功
if ($pResult) {
# 將Ping結果轉換為文字格式
$output = $pResult | Format-Table | Out-String
# 將結果追加到文件
Add-Content -Path $logFile -Value $output
Write-Host "Ping結果已寫入到文件: $logFile"
} else {
# 如果Ping失敗,記錄錯誤信息
$errorMsg = "Ping到 $ipAddress 失敗,請檢查網絡連接。"
Add-Content -Path $logFile -Value $errorMsg
Write-Host $errorMsg
}
THX,python也可以來試試XDD
問gpt的 你參考
@echo off
setlocal
rem 清空舊的結果檔案
> r:\reachable.txt (
echo 可連線主機:
)
> r:\unreachable.txt (
echo 無法連線主機:
)
rem 測試 IP 範圍 172.16.4.181 ~ 183
for /L %%d in (181,1,183) do (
call :PingHost 172.16.4.%%d
)
echo 測試完成
pause
goto :eof
:PingHost
ping %1 -n 1 -w 1000 >nul
if %errorlevel%==0 (
echo %1 >> r:\reachable.txt
echo %1 有通
) else (
echo %1 >> r:\unreachable.txt
echo %1 沒通
)
goto :eof
2025年了,不考慮用Powershell去處理嗎?
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
:: ✅ IP 清單:支援單一、多個、IP 範圍(如 172.16.0.1~172.16.0.10)
set "rawIpList=127.0.0.1 8.8.8.8 123.123.123.123 172.16.0.1~172.16.0.10"
:: 結果檔案
set "successFile=ping_success.txt"
set "failedFile=ping_failed.txt"
:: 如不存在則寫入標題
if not exist "%successFile%" (
echo 成功連線的 IP 紀錄: >> "%successFile%"
)
if not exist "%failedFile%" (
echo 無法連線的 IP 紀錄: >> "%failedFile%"
)
:: 解析 IP 清單(支援範圍)
set "ipList="
for %%I in (%rawIpList%) do (
echo %%I | findstr "~" >nul
if not errorlevel 1 (
for /f "tokens=1,2 delims=~" %%A in ("%%I") do (
set "ipStart=%%A"
set "ipEnd=%%B"
for /f "tokens=1-4 delims=." %%a in ("!ipStart!") do (
set "base=%%a.%%b.%%c"
set "start=%%d"
)
for /f "tokens=4 delims=." %%e in ("!ipEnd!") do (
set "end=%%e"
)
for /L %%n in (!start!,1,!end!) do (
set "ipList=!ipList! !base!.%%n"
)
)
) else (
set "ipList=!ipList! %%I"
)
)
:: 開始測試(使用 TTL 判斷)
for %%I in (!ipList!) do (
echo.
echo 正在測試 %%I...
set ok=0
for /L %%R in (1,1,5) do (
if !ok! EQU 0 (
ping -n 1 -w 1000 %%I | findstr /i "TTL=" >nul
if not errorlevel 1 (
echo → 第 %%R 次成功(有 TTL 回應)
set ok=1
) else (
echo → 第 %%R 次失敗
timeout /t 1 >nul
)
)
)
set now=%date% %time%
if !ok! EQU 1 (
echo %%I - 測試成功 [!now!] >> "%successFile%"
echo → %%I 測試成功
) else (
echo %%I - 測試失敗 [!now!] >> "%failedFile%"
echo → %%I 測試失敗(已重試 5 次)
)
)
echo.
echo 所有測試完成!
echo 成功記錄:%successFile%
echo 失敗記錄:%failedFile%
pause
endlocal
一樣是用GPT產生的,不過我這個可以測試單獨幾個IP,也可以測試IP範圍
記得檔案格式是UTF8沒有BOM
# Host List"
$pinghost = "163.32.127.167","163.32.127.153","163.32.127.154","163.32.127.155","163.32.127.156","163.32.127.157","163.32.127.158",
"163.16.1.14" ,"163.32.250.185","163.28.136.31" ,"163.28.136.33"
# 開始ping每個Host並回應是否成功跟時間。
foreach ($pinghost in $pinghost) {
$pingResult = Test-Connection -ComputerName $pinghost -Count 1 -Quiet
if ($pingResult) {
$pingResponse = Test-Connection -ComputerName $pinghost -Count 1
$pingTime = $pingResponse.ResponseTime
Write-Output "成功,時間:$pingTime ms ($pinghost)"
} else {
$pingResponse = ping $pinghost -n 1 | Select-Object -Index 2
Write-Output "失败,$pingResponse($pinghost)"
}
}
Write-Host "按任意键继续..."
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
以上給你當作參考,你在判斷式那邊把紀錄輸出到你要的檔案應該就可以了。