Windows CMD中嵌套IF语句中的%ERRORLEVEL%问题

5
在Windows 7登录脚本中,首先我想测试某个文件是否存在。只有在这种情况下,我才想测试某个注册表键是否存在。如果不是这种情况,我想做一些事情。因此,这是我想到的代码:
IF EXIST %SOME_FILE% (
    REG QUERY "HKCU\..." /v some_key
    IF %ERRORLEVEL%=="1" (
        do_some_stuff
    )
)

我遇到的问题是,如果文件存在,%ERRORLEVEL%等于0,而不是注册表键存在。如果我不进行文件测试,一切都很好。现在,我可以使用标签和goto,但我并不是真正的支持者。有没有(简单)的替代方法?

7
如果错误级别为1(....)请执行。另外,请搜索一下批处理文件中的“延迟扩展”。 - MC ND
5
阅读微软支持文章《在批处理文件中测试特定的错误级别》,并在命令提示符窗口中运行 if /? 命令,阅读输出的帮助页面。在您的情况下,if errorlevel 1 表示如果前一个应用程序的退出代码大于或等于1,则足以满足条件。 - Mofi
4
查询注册表"HKCU..."中的某个键值,如果存在则执行一些操作。 - aschipfl
抱歉,我习惯于使用Bash,因为在我看来那里的事情似乎更加直接明了。此外,当涉及到cmd时,Google、SO和其他网站比manpages更有帮助,这就是为什么我倾向于首先在那里查找信息的原因。 :) - Thomas
2个回答

6

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


只需在文件顶部添加以下内容即可:

setlocal enableDelayedExpansion

在变量周围使用感叹号;使用!errorlevel!代替百分号。虽然我完全同意Simon Catlin的答案。

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

您是否考虑过切换到PowerShell?请注意在REG.EXE中的显式路径。这样可以避免有人将带有支付负载的REG.EXE插入您的路径。


我不怎么做Windows脚本编程,这也是我迄今为止避免使用PS的原因之一。此外,我偶尔会遇到没有安装PS的电脑。另外,我还需要说服我的同事也使用PS,因为我不想成为唯一一个知道如何使用它的人... :) - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接