&& 在批处理/cmd 脚本中如何工作?

Tec*_*rse 7 command-line

(我使用的是Win10 20H2)
我知道如果你有command A && command B,那么在“成功完成”时才command B执行是否成功的呢?command Acommand A

  • 我的第一个想法是它必须基于errorlevel's,但不可能是这样,如下所示,如果您在没有输入内容的情况下按 Enter 键,那么,正如预期的那样,您将不会看到“成功”消息,并且errorlevel是变成1
    @echo off
    :loop
    set /p u_p= && echo success
    echo current errorlevel %errorlevel%
    goto loop
    
    Run Code Online (Sandbox Code Playgroud)errorlevel但是,如果您随后输入有效的输入,尽管剩余时间为 , 您仍会收到成功消息1,那么是什么触发了&&给出成功消息呢?

  • 有人建议可能需要延迟扩展,因为如果没有它,代码会错误地报告当前的errorlevel,但是我已经尝试过,并替换引用 的行errorlevel,但我仍然得到指示成功的输出,尽管errorlevel不是0输入空输入后的所有后续输入:
    if errorlevel 1 (echo current errorlevel geq 1) else (echo current errorlevel leq 0)
    
    Run Code Online (Sandbox Code Playgroud)

我相当确定解释不是&& a 触发的0 errorlevel,而是代码导致了errorlevel?的错误报告。

Dav*_*ill 1

我的第一个想法是它必须基于错误级别。

是的,但你失踪了enabledelayedexpansion

这是必需的,因为脚本中实际上存在一个循环,并且第一次设置变量后就不会更改enabledelayedexpansionerrorlevel

使用setlocal enabledelayedexpansion将给出您期望的行为:

@echo off
setlocal enabledelayedexpansion
:loop
set /p u_p= && echo success
echo current errorlevel %errorlevel%
goto loop
endlocal
Run Code Online (Sandbox Code Playgroud)

启用延迟扩展

设置EnabledDelayedExpansion将导致每个变量在执行时而不是在解析时扩展。

Source Setlocal - 局部变量 - Windows CMD - SS64.com


进一步阅读

  • 即使我将 %s 替换为!s,这对我不起作用? (2认同)