我做了一段批处理代码,我认为这会奏效。我在想这段代码在做什么?我有一些插件,我想测试部署是否正确。所以我从plugins.txt 中得到了pluginlink。然后我用java语句从SVN获取插件。我部署了插件并在 test1.txt 中获得了反馈。然后我在那个文件中做一个 findStr 并搜索“BUILD SUCCESSFUL”,如果它在那里我想添加句子 Build Gelukt,如果它失败我想添加 Build Fout。但是我总是得到答案 Build Gelukt,而正如您在图像中看到的那样,他发回了构建失败的信息。

这段代码有什么问题?

for /f "tokens=* delims= " %%a in (plugins.txt) do (
echo %%a
cd "C:\dotCMS Automatic Install"
java -cp .;"C:\dotCMS Automatic Install\svnkit.jar" Test %%a
cd %dotcms_home%
call ant deploy-plugins > test1.txt
FindStr "SUCCESSFUL" test1.txt
if %ERRORLEVEL% ==1 (echo ^<tr BGCOLOR=\"#FFFFFF\"^>^<td^>%%a^</td^>^<td^>Build Fout^</td^>^</tr^> >> C:\dotCMSResults\goedje.html ) else (echo ^<tr BGCOLOR=\"#00FF00\"^>^<td^>%%a^</td^>^<td^>Build Gelukt^</td^>^</tr^> >> C:\dotCMSResults\goedje.html)
del test1.txt
rem call ant undeploy-plugins >> test.txt
)

最佳答案

经典批处理问题 - 您正在设置 ERRORLEVEL 并尝试在同一 %ERRORLEVEL% 子句中使用 DO() 访问它。 %VAR% 扩展发生在解析时,整个 FOR ... DO() 语句被解析一次,因此您在执行该语句之前会看到 ERRORLEVEL 的值。显然这行不通。

jeb 在他关于消失的引用的评论中提到了答案。如果您将 setlocal enableDelayedExpansion 放在顶部,然后使用 !ERRORLEVEL! 而不是 %ERRORLEVEL% ,您的问题将得到解决。此外,GregHNZ 是正确的,因为 ERRORLEVEL 测试应该在您的 FINDSTR 语句之后立即发生。

还有其他方法可以处理不需要延迟扩展的括号内的 ERRORLEVEL:

以下测试 ERRORLEVEL 是否大于或等于 1

IF ERRORLEVEL 1 (...) ELSE (...)

下面根据前一个命令的结果有条件地执行命令
FindStr "SUCCESSFUL" test1.txt && (
  commands to execute if FindStr succeeded
) || (
  commands to execute if prior command failed.
)

关于shell - FindStr 无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9835783/

10-10 17:43