FINDSTR が文字列を見つけられなかった場合に条件付きでアクションを実行する方法 質問する

FINDSTR が文字列を見つけられなかった場合に条件付きでアクションを実行する方法 質問する

次のようなバッチファイルがあります。

CD C:\MyFolder
findstr /c:"stringToCheck" fileToCheck.bat
IF NOT XCOPY "C:\OtherFolder\fileToCheck.bat" "C:\MyFolder" /s /y

これを実行しようとすると、エラーが発生します (「C:\OtherFolder\fileToCheck.bat」は現時点では予期されていませんでした)。

何が間違っているのか教えてください。

ベストアンサー1

C:\MyFolder 内の既存のファイルが完全に欠落しているか、"stringToCheck" が欠落している場合は、C:\OtherFolder\fileToCheck.bat を C:\MyFolder にコピーする必要があると思います。

FINDSTR は、文字列が見つかった場合は ERRORLEVEL を 0 に設定し、見つからない場合は 1 に設定します。また、ファイルが見つからない場合は errorlevel を 1 に設定します。また、一致する各行を出力します。これを条件として使用しようとしているので、出力は必要なく、表示したくないと思います。まず最初に提案するのは、 . を使用して、通常の出力とエラー出力の両方を nul にリダイレクトすることです>nul 2>&1

解決策1(以前の回答とほぼ同じです)

IF ERRORRLEVEL Nを使用して、errorlevel が >= N であるかどうかを確認できます。または、 を使用してIF NOT ERRORLEVEL N、errorlevel が < N であるかどうかを確認できます。この場合、前者が必要です。

findstr /c:"stringToCheck" "c:\MyFolder\fileToCheck.bat" >nul 2>&1
if errorlevel 1 xcopy "C:\OtherFolder\fileToCheck.bat" "c:\MyFolder"

解決策2

%ERRORLEVEL% を使用して、errorlevel の特定の値をテストできます。値が 1 に等しいかどうかをチェックすることもできますが、ファイルが存在し、文字列が含まれている場合にのみ 0 に設定されるため、値が 0 に等しくないかどうかを確認する方が安全です。

findstr /c:"stringToCheck" "c:\MyFolder\fileToCheck.bat" >nul 2>&1
if not %errorlevel% == 0 xcopy "C:\OtherFolder\fileToCheck.bat" "c:\MyFolder"

または

findstr /c:"stringToCheck" "c:\MyFolder\fileToCheck.bat" >nul 2>&1
if %errorlevel% neq 0 xcopy "C:\OtherFolder\fileToCheck.bat" "c:\MyFolder"

解決策3

前のコマンドの成功または失敗に基づいて条件付きでコマンドを実行するための非常にコンパクトな構文があります。cmd1 && cmd2 || cmd3つまり、cmd1 が成功した場合 (errorlevel=0) は cmd2 を実行し、cmd1 が失敗した場合 (errorlevel<>0) は cmd3 を実行します。&& のみ、または || のみを使用できます。すべてのコマンドは同じ行に記述する必要があります。複数のコマンドを条件付きで実行する必要がある場合は、括弧を追加して複数の行を使用できます。

cmd1 && (
   cmd2
   cmd3
) || (
   cmd4
   cmd5
)

あなたの場合、必要なのは

findstr /c:"stringToCheck" "c:\MyFolder\fileToCheck.bat" >nul 2>&1 || xcopy "C:\OtherFolder\fileToCheck.bat" "c:\MyFolder"

ただし、注意してください - は、||最後に実行されたコマンドの戻りコードに応答します。以前の疑似コードでは、||cmd1 が失敗した場合に が起動するのは明らかですが、cmd1 が成功しても cmd3 が失敗した場合にも が起動します。

したがって、成功ブロックが失敗する可能性のあるコマンドで終了する場合は、成功が保証されている無害なコマンドを追加する必要があります。私は(CALL )、無害で常に成功する を使用することを好みます。また、ERRORLEVEL を 0 に設定するのも便利です。常に失敗し、ERRORLEVEL を 1 に設定する類似のコマンドもあります(CALL)

おすすめ記事