バッチファイルの「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 を設定することです。path は、ping や findstr などのプログラムがある場所へのパスを保持するために設計された特別な環境変数です。

set path=... と入力すると、このリストがファイルで上書きされ、今回実行されたパスがクリアされます。幸い、set を使用すると、このスクリプトの実行中にのみ変数が変更され、すべてのセッションで変更されるわけではありません。このため、cmd に移動して csv の値で ping と入力すると、引き続き機能します。

同じ cmd セッションで set path= 行を入力すると、cmd を閉じて再度開くまで、値を指定した ping の手動入力も機能しなくなります。

をおよび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

関連情報