在批处理文件的“for”循环中使用“ping”和“findstr”首先会引发错误,而不是内部外部命令,但它再次显示输出

在批处理文件的“for”循环中使用“ping”和“findstr”首先会引发错误,而不是内部外部命令,但它再次显示输出

此批处理文件

@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

在里面系统变量您已经有一个名为 path 的变量,
它指向命令解释器()将
搜索并执行您的命令,查找具有
以下扩展名的文件:路径扩展,当没有找到时,将返回:

  • ‘ping’ 不被识别为内部或外部命令,也不是可运行的程序或批处理文件。
  • ‘findstr’ 不被识别为内部或外部命令、可运行程序或批处理文件。

我建议您了解变量的名称并开始使用不同的名称。

答案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

相关内容