iT邦幫忙

1

批次ping 記錄成檔案(win11 cmd)

  • 分享至 

  • xImage

小弟想ping一些IP,所以按帖子寫了個測試腳本,想將ping得通和不通得分成兩個檔,但語法判斷上好像有錯??
https://ithelp.ithome.com.tw/upload/images/20250429/20171485aDHzUV3fdI.png
如圖172.16.4.181不通,182、183是通的
但出來的檔案是:
https://ithelp.ithome.com.tw/upload/images/20250429/20171485WDEZiJkRpC.png
想請教各位大大,是錯在哪了/images/emoticon/emoticon06.gif

看更多先前的討論...收起先前的討論...
Willy iT邦新手 5 級 ‧ 2025-04-29 16:31:43 檢舉
大致上看起來是對
可能括號吧
可以試試看這樣
ping 172.16.4.183 -n 1 >nul && (
echo 172.16.4.183 >> "C:\Users\%USERNAME%\Desktop\reachable.txt"
) || (
echo 172.16.4.183 >> "C:\Users\%USERNAME%\Desktop\unreachable.txt"
)
因為他是兩段 不是一段 分開可能會比較正常
&&成功
||失敗
ray_dai iT邦新手 5 級 ‧ 2025-04-30 10:24:08 檢舉
THX,但似乎不是()問題
ray_dai iT邦新手 5 級 ‧ 2025-04-30 10:26:10 檢舉
在想是不是return值的問題
Willy iT邦新手 5 級 ‧ 2025-04-30 13:32:14 檢舉
如果是要增加判斷 就要加 setlocal enabledelayedexpansion

如果是批次檔執行 %d 要改成 %%d
setlocal enabledelayedexpansion

for /L %%d in (181,1,183) do (
ping -n 1 172.16.4.%%d >nul
if !errorlevel! == 0 (
echo 172.16.4.%%d >> C:\Desktop\reachable.txt
) else (
echo 172.16.4.%%d >> C:\Desktop\unreachable.txt
)
)

!XXX! 一般變數
%XXX% 延展變數
ray_dai iT邦新手 5 級 ‧ 2025-04-30 15:20:37 檢舉
THX,我在試試
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
japhenchen
iT邦超人 1 級 ‧ 2025-04-30 16:34:07
最佳解答

2025,我只用python
https://ithelp.ithome.com.tw/upload/images/20250430/201179548AlXvqjGDL.jpg

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
}
ray_dai iT邦新手 5 級 ‧ 2025-04-30 18:11:27 檢舉

THX,python也可以來試試XDD

1
copemoe
iT邦好手 2 級 ‧ 2025-04-29 15:05:22

問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
ray_dai iT邦新手 5 級 ‧ 2025-04-30 10:28:28 檢舉

這個是用bat的功能嗎
也可以試試THX

3
bluegrass
iT邦高手 1 級 ‧ 2025-04-29 17:23:39

用PINGINFOVIEW不就好?

https://ithelp.ithome.com.tw/upload/images/20250429/20102031dJsD7kyUcH.png

ray_dai iT邦新手 5 級 ‧ 2025-04-30 10:30:29 檢舉

THX,不錯的工具,但我也想藉機多練習cmd腳本

1
zero
iT邦好手 1 級 ‧ 2025-04-30 14:17:12

2025年了,不考慮用Powershell去處理嗎?

ray_dai iT邦新手 5 級 ‧ 2025-04-30 15:26:25 檢舉

可以歐,雖然之前沒用過,但讓AI生成個測試,成功了
而且還大略能看懂XDD

1
alan0219
iT邦新手 5 級 ‧ 2025-04-30 23:24:35

@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

1
小草
iT邦見習生 ‧ 2025-05-01 23:21:15
# 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")

以上給你當作參考,你在判斷式那邊把紀錄輸出到你要的檔案應該就可以了。

我要發表回答

立即登入回答