嵌套 IF 中的 Windows CMD %ERRORLEVEL%

Tho*_*mas 4 cmd batch-file

首先在 Windows 7 登录脚本中,我想测试是否存在某个文件。如果(且仅当)是这种情况,我想测试是否存在某个注册表项。如果不是这样,我想做一些事情。所以这就是我想出的:

IF EXIST %SOME_FILE% (
    REG QUERY "HKCU\..." /v some_key
    IF %ERRORLEVEL%=="1" (
        do_some_stuff
    )
)
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,%ERRORLEVEL% 等于 0,如果文件存在,而不是注册表项存在。如果我不做文件测试,一切都很好。现在,我可以使用标签和转到,但我并不是真正的朋友。有(简单的)替代方案吗?

Blo*_*ied 5

简单的解决方案?当然。%variable%在代码块之前计算代码块。您需要的是延迟扩展,即变量内容的命令设置。


只需将此添加到文件的顶部,

setlocal enableDelayedExpansion
Run Code Online (Sandbox Code Playgroud)

并在变量周围使用感叹号;!errorlevel!而不是百分号。

虽然,我完全同意 Simon Catlin 的回答。


Sim*_*lin 2

Windows shell 脚本中的嵌套 IF 非常糟糕。我会选择:

IF EXIST %SOME_FILE% (
    %SystemRoot%\System32\reg.exe query hklm\system\currentcontrolset\services\wuauserv /v type 2>nul || (
        echo Do something
        echo Do something else
        )
    )
Run Code Online (Sandbox Code Playgroud)

您是否考虑过切换到 PowerShell?请注意 REG.EXE 的显式路径。这消除了有人将有效加载的 REG.EXE 塞入您的路径的风险。