嵌套IF中的Windows CMD%ERRORLEVEL%

时间:2017-02-01 15:23:42

标签: batch-file cmd

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

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

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

2 个答案:

答案 0 :(得分:4)

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

只需将其添加到文件顶部

即可
setlocal enableDelayedExpansion

并在变量周围使用感叹号; !errorlevel!代替百分号。

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

答案 1 :(得分:1)

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
        )
    )

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