【问题标题】:How to get ERRORLEVEL for each command in FOR LOOP?如何为 FOR LOOP 中的每个命令获取 ERRORLEVEL?
【发布时间】:2017-09-18 18:20:53
【问题描述】:

我正在使用 Windows 批处理文件比较来自 2 个文件夹的文件列表。它打印结果是否通过/失败。

当前工作批处理文件:

for /F "tokens=*" %%f in (list.txt) do compare Folder1\%%f.png Folder2\%%f.png

如果有 3 个文件,运行此命令后的输出如下所示:

PASS
FAIL
PASS

如果我在这里回显 %ERRORLEVEL%,它将返回 0,因为 for 循环运行良好。

echo %ERRORLEVEL%

0

我的要求

在 FOR 循环中回显每个命令的结果。

我的预期输出

0
1
0

如何更改批处理文件以实现此目的?

【问题讨论】:

    标签: windows batch-file cmd errorlevel


    【解决方案1】:

    假设 FAIL 改变了 ERRORLEVEL,使用 & 来回显每个命令的 ERRORLEVEL

    SETLOCAL EnableDelayedExpansion
    for /F "tokens=*" %%f in (list.txt) do compare Folder1\%%f.png Folder2\%%f.png & echo !ERRORLEVEL!
    ENDLOCAL
    

    输出:

    PASS
    0
    FAIL
    1
    PASS
    0
    

    我假设 PASS/FAIL 是您的 compare 实用程序的输出。要隐藏此输出,请使用重定向 >NUL,如下所示:

    SETLOCAL EnableDelayedExpansion
    for /F "tokens=*" %%f in (list.txt) do compare Folder1\%%f.png Folder2\%%f.png > NUL & echo !ERRORLEVEL!
    ENDLOCAL
    

    输出:

    0
    1
    0
    

    来自documentation

    & : 命令1 & 命令2

    用于在一个命令行上分隔多个命令。 Cmd.exe 运行 第一个命令,然后是第二个命令。

    【讨论】:

    • 这行不通,因为: 1. 你需要delayed expansion for !ErrorLevel! 来获取迭代的ErrorLevel;否则,返回读取整个命令行时出现的 ErrorLevel; 2.&&防止返回非零的ErrorLevels,你必须使用&代替;
    • @aschipfl,抱歉忽略。我已经更新了答案并添加了文档。感谢您指出。
    • 我试过这个。得到以下输出: PASS !ERRORLEVEL!失败!错误级别!通过!错误级别!
    • @InsecureNoob,那你显然忘记启用延迟扩展了……
    猜你喜欢
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多