Windows CMD %ERRORLEVEL% in nested IF



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

IF EXIST %SOME_FILE% (
    REG QUERY "HKCU..." /v some_key
    IF %ERRORLEVEL%=="1" (
        do_some_stuff
    )
)

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

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


只需将其添加到文件顶部,

setlocal enableDelayedExpansion

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

虽然,我完全同意西蒙·卡特林的回答。

Windows shell脚本中的嵌套IF很讨厌。 我会选择:

IF EXIST %SOME_FILE% (
    %SystemRoot%System32reg.exe query hklmsystemcurrentcontrolsetserviceswuauserv /v type 2>nul || (
        echo Do something
        echo Do something else
        )
    )

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

最新更新