我有一个批处理文件如下;
CD C:\MyFolder
findstr /c:"stringToCheck" fileToCheck.bat
IF NOT XCOPY "C:\OtherFolder\fileToCheck.bat" "C:\MyFolder" /s /y
我在尝试执行此操作时遇到错误(“C:\OtherFolder\fileToCheck.bat”此时是意外的。)。
请让我知道我做错了什么。
最佳答案
如果 C:\MyFolder 中的现有文件完全丢失,或者缺少“stringToCheck”,我假设您想将 C:\OtherFolder\fileToCheck.bat 复制到 C:\MyFolder。
如果找到字符串,FINDSTR 将 ERRORLEVEL 设置为 0,否则设置为 1。如果文件丢失,它还会将 errorlevel 设置为 1。它还打印出匹配的每一行。由于您试图将其用作条件,因此我认为您不需要或不想看到任何输出。我建议的第一件事是使用 >nul 2>&1
将正常和错误输出重定向到 nul。
解决方案 1(与之前的答案基本相同)
您可以使用 IF ERRORRLEVEL N
检查错误级别是否 >= N。或者您可以使用 IF NOT ERRORLEVEL N
检查错误级别是否 < N。在你的情况你想要前者。
findstr /c:"stringToCheck" "c:\MyFolder\fileToCheck.bat" >nul 2>&1
if errorlevel 1 xcopy "C:\OtherFolder\fileToCheck.bat" "c:\MyFolder"
方案二
您可以使用 %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"
方案三
有一个非常紧凑的语法可以根据前一个命令的成功或失败有条件地执行命令: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 失败,它也会触发。
因此,如果您的成功 block 以可能会失败的命令结尾,那么您应该附加一个保证成功的无害命令。我喜欢使用 (CALL )
,这是无害的,而且总是成功。将 ERRORLEVEL 设置为 0 也很方便。有一个推论 (CALL)
总是失败并将 ERRORLEVEL 设置为 1。
关于windows - 如果 FINDSTR 找不到字符串,如何有条件地采取行动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8530976/