Jenkins 正在调用批处理脚本。此批处理脚本使用 构建 .NET 项目msbuild
,并将其记录到日志文件中。
现在我想检查构建是否失败。部分操作可以通过以下命令完成:
findstr /N /C:"Build FAILED." %LOGFILE%
set "FINDSTRERR=%ERRORLEVEL%"
echo "FINDSTRERR: %FINDSTRERR%"
if "%FINDSTRERR%"=="0" (
echo "ERROR: Build failed."
exit 1
)
因此,批处理脚本在日志文件中搜索字符串Build FAILED
,如果存在,则批处理脚本应以退出代码退出1
。
当我查看这些文件的输出时,我看到了以下内容:
6164:Build FAILED.
"FINDSTRERR: "
并且脚本正在进一步运行。但我期待的是类似这样的内容"FINDSTRERR: 0"
。
为什么 batch/findstr 在这里没有按预期工作?
答案1
0(假)在至少一个文件的至少一行中发现匹配项。 如果在任何文件的任何行中都找不到匹配项(或者根本没有找到该文件),则为 1(真)。 2 语法错误 无效的开关只会在错误流中打印错误消息。
- 但我不喜欢这样做
if | else errorlevel [0-2]
,我建议你尝试使用以下方法操纵输出命令[&& 运算符(执行此操作)|或|(执行此操作)]2,当进行这个机械过程时,你会做同样的事情errorlevel
(在 if else 条件中);此外,不需要创建变量(%FINDSTRERR%
) 并应用其值更新。
通过与操作员一起完成这项工作,您可以创建自己的errorlevel
0 | 1来自运营商&& (1)||(0)
根据您的行为:
@echo off && color 0a && setlocal enabledelayedexpansion & title ...\%~nx0
set "LOGFILE=D:\path\to\folder\where\are\the\file_log\target.log" && echo[
"%__APPDIR__%\findstr.exe" /N /L /C:"Build FAILED\." "!LOGFILE!" >nul && (
echo/ [1] ERROR: Build Failed^^!! ) || (echo/ [0] Build: Successful^^!! )
"%__APPDIR__%timeout.exe" /t 2 >nul & endlocal && goto :EOF
- 输出情况
&&
构建失败。细绳匹配在文件.log中:
[1] ERROR: Build failed!
^---:> == your errorlevel
- 输出情况
||
构建:成功!细绳不匹配在文件.log中:
[0] Build: Successful!
^---:> == your errorlevel
观察:- 编辑:set "LOGFILE=D:\path\to\folder\where\are\the\file_log\target.log"
,充满drive:/path/to/file.log...
或者...
@echo off
setlocal enabledelayedexpansion
set "LOGFILE=D:\path\to\target.log"
findstr.exe /C:"Build FAILED\." "%LOGFILE%" >nul && (
echo/ ERROR: Build Failed
) || (
echo/ Build: Successful
)
endlocal