此批处理文件
@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= 行,则手动键入带有值的 ping 将不再起作用,直到关闭并重新打开 cmd。
如果您将:更改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