非常好奇。在前面放一个CALL,一切应该都没问题。
call rustc hello.rs && hello
我并不完全理解机制。我知道 &&
和 ||
不直接读取动态的 %errorlevel%
值,而是在某个低层级上进行操作。它们根据最近执行的命令的结果有条件地触发,而不管当前的 %errorlevel%
值如何。||
甚至可以在未设置 %errorlevel%
的失败情况下触发!请参见 Windows 中的文件重定向和 %errorlevel% 和 batch: “rd” 的退出代码在错误时也为 0 的示例。
rustc
是批处理文件,其行为取决于是否使用了 CALL。如果没有使用 CALL,则 &&
和 ||
运算符仅响应命令是否运行 - 它们忽略脚本的退出代码。使用 CALL,则它们正常响应脚本的退出代码,以及响应脚本无法运行(可能脚本不存在)的情况。
换句话说,批处理脚本只有在通过 CALL 启动时才会通知 &&
和 ||
运算符有关退出代码的信息。
更新
经过仔细阅读 foxidrive 的(现已删除的)答案,我意识到情况更加复杂。
如果使用 CALL,则一切都能正常工作 - &&
和 ||
会响应脚本返回的 ERRORLEVEL。脚本中的早期命令可能会将 ERRORLEVEL 设置为 1,只要没有后续脚本命令清除错误,返回的 ERRORLEVEL 1 将被正确报告给 &&
和 ||
。
如果未使用 CALL,则 &&
和 ||
响应脚本中最后执行的命令的 errorcode。脚本中的早期命令可能会将 ERRORLEVEL 设置为 1。但是,如果最后一个命令是成功执行的 ECHO 语句,则 &&
和 ||
会响应 ECHO 命令的成功而不是脚本返回的 ERRORLEVEL 1。
真正的问题在于,EXIT /B 1
除非通过 CALL 调用脚本,否则不会向 &&
或 ||
报告 ERRORLEVEL。条件运算符检测到 EXIT 命令成功执行,并忽略返回的 ERRORLEVEL!
如果脚本执行的最后一个命令是:
cmd /c exit %errorlevel%
这将正确地将返回的ERRORLEVEL报告给&&
和||
,无论脚本是否被CALL调用。
以下是一些演示我所说的测试脚本。
test1.bat
@echo off
:: This gives the correct result regardless if CALL is used or not
:: First clear the ERRORLEVEL
(call )
:: Now set ERRORLEVEL to 1
(call)
test2.bat
@echo off
:: This only gives the correct result if CALL is used
:: First clear the ERRORLEVEL
(call )
:: Now set ERRORLEVEL to 1
(call)
rem This command interferes with && or || seeing the returned errorlevel if no CALL
test3.bat
@echo off
:: This only gives the correct result if CALL is used
:: First clear the ERRORLEVEL
(call )
:: Now set ERRORLEVEL to 1
(call)
rem Ending with EXIT /B does not help
exit /b %errorlevel%
test4.bat
@echo off
:: This gives the correct result regardless if CALL is used or not
:: First clear the ERRORLEVEL
(call )
:: Now set ERRORLEVEL to 1
(call)
rem The command below solves the problem if it is the last command in script
cmd /c exit %errorlevel%
现在测试带有和不带有CALL的情况:
>cmd /v:on
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
>test1&&echo Success, yet errorlevel=!errorlevel!||echo Failure with errorlevel=!errorlevel!
Failure with errorlevel=1
>test2&&echo Success, yet errorlevel=!errorlevel!||echo Failure with errorlevel=!errorlevel!
Success, yet errorlevel=1
>test3&&echo Success, yet errorlevel=!errorlevel!||echo Failure with errorlevel=!errorlevel!
Success, yet errorlevel=1
>test4&&echo Success, yet errorlevel=!errorlevel!||echo Failure with errorlevel=!errorlevel!
Failure with errorlevel=1
>call test1&&echo Success, yet errorlevel=!errorlevel!||echo Failure with errorlevel=!errorlevel!
Failure with errorlevel=1
>call test2&&echo Success, yet errorlevel=!errorlevel!||echo Failure with errorlevel=!errorlevel!
Failure with errorlevel=1
>call test3&&echo Success, yet errorlevel=!errorlevel!||echo Failure with errorlevel=!errorlevel!
Failure with errorlevel=1
>call test4&&echo Success, yet errorlevel=!errorlevel!||echo Failure with errorlevel=!errorlevel!
Failure with errorlevel=1
>
rustc.exe hello.rs
吗? - wimhrustc.exe
之后直接加入exit /b %errorlevel%
?没有rustc.bat
,这就像猜谜游戏,但这可能会导致&&
按照最初的预期工作。 - Magoo