![バッチファイルの「for」ループで「ping」と「findstr」を使用すると、最初に内部外部コマンドではなくエラーがスローされますが、出力が再度表示されます。](https://rvso.com/image/1671509/%E3%83%90%E3%83%83%E3%83%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%80%8Cfor%E3%80%8D%E3%83%AB%E3%83%BC%E3%83%97%E3%81%A7%E3%80%8Cping%E3%80%8D%E3%81%A8%E3%80%8Cfindstr%E3%80%8D%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E6%9C%80%E5%88%9D%E3%81%AB%E5%86%85%E9%83%A8%E5%A4%96%E9%83%A8%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E3%82%B9%E3%83%AD%E3%83%BC%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E5%87%BA%E5%8A%9B%E3%81%8C%E5%86%8D%E5%BA%A6%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82.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 を設定することです。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