![在批次檔的「for」迴圈中使用「ping」和「findstr」首先會引發錯誤,不是內部外部命令,但它再次顯示輸出](https://rvso.com/image/1671509/%E5%9C%A8%E6%89%B9%E6%AC%A1%E6%AA%94%E7%9A%84%E3%80%8Cfor%E3%80%8D%E8%BF%B4%E5%9C%88%E4%B8%AD%E4%BD%BF%E7%94%A8%E3%80%8Cping%E3%80%8D%E5%92%8C%E3%80%8Cfindstr%E3%80%8D%E9%A6%96%E5%85%88%E6%9C%83%E5%BC%95%E7%99%BC%E9%8C%AF%E8%AA%A4%EF%BC%8C%E4%B8%8D%E6%98%AF%E5%85%A7%E9%83%A8%E5%A4%96%E9%83%A8%E5%91%BD%E4%BB%A4%EF%BC%8C%E4%BD%86%E5%AE%83%E5%86%8D%E6%AC%A1%E9%A1%AF%E7%A4%BA%E8%BC%B8%E5%87%BA.png)
這個批次文件
@echo off
set path=C:\Users\ssiyengar\Desktop\Pingtest\pinglist.csv
set file=C:\Users\ssiyengar\Desktop\Pingtest\temp.txt
set qosping=1
cls
for /f "tokens=1-3 delims=," %%a IN (%path%) do (
ping %%c -n %qosping% > %file%
findstr "time< time=" %file% >nul
if %errorlevel%==1 (
echo %%a %%b IP %%c Ping FAILURE
) else (
echo %%a %%b IP %%c Ping SUCCESS
)
)
pause
輸出:
'ping' is not recognized as an internal or external command,
operable program or batch file.
'findstr' is not recognized as an internal or external command,
operable program or batch file.
SYS1 MC1 IP XX.XX.XX.XX Ping SUCCESS
CSV 檔案是:
SYS1,MC1,IP1 \
SYS2,MC2,IP2
為什麼是 ping/查找字串未能識別?
如果我直接傳遞值而不是從 CSV 檔案傳遞值,則效果很好。為什麼?我該如何解決?
注意:環境變數已經包含Sys32
.
答案1
問題是你設定了路徑。 Path 是一個特殊的環境變量,旨在保存具有程式(例如 ping 和 findstr)的位置的路徑。
透過輸入 set path=... 您可以使用一個檔案覆寫此列表,從而清除這次運行的路徑。幸運的是,使用 set 只會在腳本運行時更改變量,而不是在所有會話中更改變量。這就是為什麼轉到 cmd 並使用 csv 中的值輸入 ping 仍然有效。
如果您在相同 cmd 會話中鍵入 set path= 行,則在關閉並重新開啟 cmd 之前,手動鍵入帶有值的 ping 將不再運作。
如果您更改:set path=
和set mypath=
到您的腳本將會起作用%path%
。%mypath%
答案2
答案3
您可以嘗試這樣,也不需要建立臨時檔案:
@echo off
Title Ping Tester
set "My_CSV_PingList=%~dp0pinglist.csv"
set qosping=1
set "LogFile=%~dp0PingResults.txt"
If exist "%LogFile%" Del "%LogFile%"
cls
SetLocal EnableDelayedExpansion
for /f "tokens=1-3 delims=," %%a IN (%My_CSV_PingList%) do (
Ping -n %qosping% %%c |find "TTL=">nul) && (
set "msg=%%a %%b IP %%c Ping SUCCESS" && echo !msg!
echo !msg!>>"%LogFile%"
) || (
set "msg=%%a %%b IP %%c Ping FAILURE" && echo !msg!
echo !msg!>>"%LogFile%"
)
)
EndLocal
Start "Log" /MAX "%LogFile%"
pause
獎金:參考使用方法大量多種顏色。您可以在以下情況下以綠色顯示該訊息:成功和紅色時失敗。
@echo off
Title Ping Tester With Powershell Foreground Colors In A Batch File
set "My_CSV_PingList=%~dp0pinglist.csv"
set qosping=1
set "LogFile=%~dp0PingResults.txt"
If exist "%LogFile%" Del "%LogFile%"
cls
SetLocal EnableDelayedExpansion
for /f "tokens=1-3 delims=," %%a IN (%My_CSV_PingList%) do (
Ping -n %qosping% %%c |find "TTL=">nul) && (
set "msg=%%a %%b IP %%c Ping SUCCESS" && Call :PSColor "!msg!" Green \n
echo !msg!>>"%LogFile%"
) || (
set "msg=%%a %%b IP %%c Ping FAILURE" && Call :PSColor "!msg!" Red \n
echo !msg!>>"%LogFile%"
)
)
EndLocal
Start "Log" /MAX "%LogFile%"
pause
Exit /B
::---------------------------------------------------------------
:PSColor <String> <Color> <NewLine>
If /I [%3] EQU [\n] (
Powershell Write-Host "`0%~1" -ForegroundColor %2
) Else (
Powershell Write-Host "`0%~1" -ForegroundColor %2 -NoNewLine
)
Exit /B
::--------------------------------------------------------------
答案4
停止使用過時的命令提示字元並使用 PowerShell 代替。
$hosts = Import-CSV pinglist.csv
$hosts | Foreach-Object {
$result = (Test-NetConnection -ErrorAction SilentlyContinue `
-WarningAction SilentlyContinue -InformationLevel Quiet $_.IP) ? "SUCCESS" : "FAILURE"
Write-Host ("{0} {1} IP {2} {3}" -f $_.Name,$_.mc,$_.IP,$result)
}
您需要向 CSV 新增標題行以取得每行的屬性名稱:
Name,mc,IP