![배치 파일의 'for' 루프에서 'ping' 및 'findstr'을 사용하면 먼저 내부 외부 명령이 아닌 오류가 발생하지만 다시 출력이 표시됩니다.](https://rvso.com/image/1671509/%EB%B0%B0%EC%B9%98%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20'for'%20%EB%A3%A8%ED%94%84%EC%97%90%EC%84%9C%20'ping'%20%EB%B0%8F%20'findstr'%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%A9%B4%20%EB%A8%BC%EC%A0%80%20%EB%82%B4%EB%B6%80%20%EC%99%B8%EB%B6%80%20%EB%AA%85%EB%A0%B9%EC%9D%B4%20%EC%95%84%EB%8B%8C%20%EC%98%A4%EB%A5%98%EA%B0%80%20%EB%B0%9C%EC%83%9D%ED%95%98%EC%A7%80%EB%A7%8C%20%EB%8B%A4%EC%8B%9C%20%EC%B6%9C%EB%A0%A5%EC%9D%B4%20%ED%91%9C%EC%8B%9C%EB%90%A9%EB%8B%88%EB%8B%A4..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
핑은 왜/findstr인식되지 않습니까?
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