Batch file Windows CMD%ERRORLEVEL%在嵌套的IF中

Batch file Windows CMD%ERRORLEVEL%在嵌套的IF中,batch-file,cmd,Batch File,Cmd,在Windows7登录脚本中,我首先要测试某个文件是否存在。如果(且仅当)是这种情况,我想测试某个注册表项是否存在。如果不是这样,我想做一些事情。下面是我的想法: IF EXIST %SOME_FILE% ( REG QUERY "HKCU\..." /v some_key IF %ERRORLEVEL%=="1" ( do_some_stuff ) ) 我遇到的问题是,如果文件存在,%ERRORLEVEL%等于0,而不是注册表项存在。如果我不做文件测试

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

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

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

Windows shell脚本中嵌套的IFs很糟糕。我同意:

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的风险。

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


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

setlocal enableDelayedExpansion
并在变量周围使用感叹号<代码>!错误等级而不是百分号


尽管如此,我完全同意Simon Catlin的回答。

如果错误级别为1(..
请在批处理文件中搜索
延迟扩展
,阅读Microsoft支持文章并在命令提示窗口中运行
if/?
,然后阅读输出帮助页。在您的情况下,
如果错误级别1
意味着如果上一个应用程序的退出代码大于或等于1,则1就足够了。…
r例如,查询“HKCU\…”/v some_key | | | do_stuf
对不起,我习惯于抨击那些事情似乎更简单的地方——IMHO。此外,当涉及到cmd、Google、SO和其他网站时,它们比手册页更有用,这就是为什么我首先倾向于看那里的原因。:)我不经常使用Windows脚本,这也是我迄今为止避免使用PS的部分原因。此外,我偶尔会遇到没有安装PS的电脑。此外,我还必须说服我的同事也使用PS,因为我不想成为唯一知道如何使用PS的人……:)