windows 批处理脚本执行的输出不正确

dhxwm5r4  于 2023-02-16  发布在  Windows
关注(0)|答案(1)|浏览(261)

我正在尝试运行下面的代码片段在我的windows服务器上.

  1. @echo off
  2. set BRANCH_NAME_ID=compiler_branch
  3. if %BRANCH_NAME_ID%==compiler_branch ( echo INSIDE COMPILER BRANCH )
  4. echo %BRANCH_SHORT_ID%|findstr /r "^[r][0-9][0-9]*_00$" & IF %ERRORLEVEL% == 0 ( echo IN IF ) ELSE ( echo INFO else)
  5. pause

我期望唯一的输出应该是INSIDE COMPILER BRANCH,因为BRANCH_NAME_ID变量引用了compiler_branch。但由于某种原因,我也得到了IN IF
输出:-

  1. INSIDE COMPILER BRANCH
  2. IN IF
  3. Press any key to continue . . .

根据文档https://ss64.com/nt/findstr.html,我注意到下面并相应地编写了脚本。但由于某种原因,%ERRORLEVEL%在我的代码的第3行设置为0,认为字符串不匹配:-

  1. FINDSTR will set %ERRORLEVEL% as follows:
  2. 0 A match is found in at least one line of at least one file.
  3. 1 If a match is not found in any line of any file, (or if the file is not found at all).
  4. 2 Wrong syntax

无效的开关将只在错误流中打印错误消息。
我错过什么了吗?

ibps3vxo

ibps3vxo1#

由于解释器读取文件的方式(请参阅How does the Windows Command Interpreter (CMD.EXE) parse scripts?以获取大量信息),该行中的%ERRORLEVEL%在实际运行之前会被替换为当前值。为了运行命令并正确检查值,请将if语句放在它自己的行中。

  1. @echo off
  2. set BRANCH_NAME_ID=compiler_branch
  3. if %BRANCH_NAME_ID%==compiler_branch ( echo INSIDE COMPILER BRANCH )
  4. echo %BRANCH_SHORT_ID%|findstr /r "^[r][0-9][0-9]*_00$"
  5. IF %ERRORLEVEL% == 0 ( echo IN IF ) ELSE ( echo INFO else)
  6. pause

如果出于某种原因,您绝对坚持使用&将命令链接在一起(没有理由这样做,它只会使事情变得更糟imo),那么您可以启用延迟扩展并改用!ERRORLEVEL!

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set BRANCH_NAME_ID=compiler_branch
  4. if %BRANCH_NAME_ID%==compiler_branch ( echo INSIDE COMPILER BRANCH )
  5. echo %BRANCH_SHORT_ID%|findstr /r "^[r][0-9][0-9]*_00$" & IF !ERRORLEVEL! == 0 ( echo IN IF ) ELSE ( echo INFO else)
  6. pause
展开查看全部

相关问题