Использование «ping» и «findstr» в цикле «for» пакетного файла сначала выдает ошибку, а не внутреннюю внешнюю команду, но снова показывает вывод

Использование «ping» и «findstr» в цикле «for» пакетного файла сначала выдает ошибку, а не внутреннюю внешнюю команду, но снова показывает вывод

Этот пакетный файл

@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

Почему пинг/findstrне распознается?
Если я напрямую передаю значения, а не из CSV-файла, то все работает нормально. Почему? Как это решить?
Примечание: переменные среды уже содержат путь к Sys32.

решение1

Проблема в том, что вы устанавливаете path. Path — это специальная переменная окружения, предназначенная для хранения путей к местам, в которых есть программы, такие как ping и findstr.

вводя set path=... вы перезаписываете этот список файлом, очищая путь на время его выполнения. К счастью, использование set изменяет переменную только во время выполнения этого скрипта, а не для всех сеансов. Вот почему переход в cmd и ввод ping со значениями из csv все еще работает.

Если вы введете строку set path= в том же сеансе cmd, ручной ввод ping со значениями также не будет работать, пока cmd не будет закрыт и снова открыт.

Если вы измените: set path=на set mypath=и %path%на %mypath%ваш скрипт будет работать.

решение2

всистемные переменныеу вас уже есть переменная с именем path,
она указывает на несколько путей, где находится интерпретатор команд () будет
искать и выполнять ваши команды, ища файлы с расширениями,
определенными вПутьExt, а если не найдёте, вернёт вам:

  • «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

Связанный контент