Windows批处理:将reg查询键值存入变量,但如果键不存在,则不显示错误

3
我有以下批处理命令,用于获取注册表键并将值赋给变量,但当该键不存在时会显示错误。
for /f "tokens=2,*" %%a in ('reg query HKLM\Software\MySoftware\1.0\MyExecutable /v "InstallDir" ^| findstr InstallDir') do set InstallPath=%%b

有没有办法绕过这个异常?我已经尝试在reg query之后或命令的末尾使用2>NUL,但是我收到了一个异常2> was unexpected at this time.。非常感谢您的帮助和指导。
2个回答

5
你应该像使用管道一样解决这个问题。 ^|
只需将其转义为2^>NUL
所以你会得到
for /f "tokens=2,*" %%a in ('reg query HKLM\Software\MySoftware\1.0\MyExecutable /v "InstallDir" 2^>NUL ^| findstr InstallDir') do set InstallPath=%%b

这是必要的,因为FOR循环命令部分将被解析两次。 首先在批处理文件的上下文中(这里2>NUL是意外的),然后在新的cmd.exe上下文中第二次解析(这里的2>NUL将重定向您的reg命令的stderr)。


糟糕!我没有考虑转义字符。谢谢你指出来。 - G33kKahuna
请注意,此方法仅适用于您要查找的值的名称中不包含空格的情况。假设有一个名为“产品版本”的值,那么“for /f“ tokens = 2, * ””将变得混乱无序。 - Tomalak
1
@Tomalak 你说得对,但是这样你就知道你的值包含多少个空格,然后你可以将 tokens=2,* 更改为 tokens=2+<space>,* - jeb
总的来说,问题归结为:批处理文件中的基本操作很困难,任何稍微高级一点的操作都会让人头疼。不过这是个不错的补充。 - Tomalak
有趣的是,我想到了转义字符,但我预先构建了要在环境变量中执行的命令。当你这样做时,你需要双重转义(^^^>)变量,这样转义的重定向就会出现在for命令中。感谢您指引我做到了这一点。此外,您不需要查找正确的行,您可以指定tokens=1,2,*,然后使用 for ... %%a in (...) do if %%a==InstallDir set InstallPath=%%c - Rolf

0
你把 reg query 的结果放在哪里了?这个应该可以运行(看一下 findstr 前面的部分):
for /f "tokens=2,*" %%a in ('reg query HKLM\Software\MySoftware\1.0\MyExecutable /v "InstallDir" 2>NUL ^| findstr InstallDir') do set InstallPath=%%b

1
这与他的问题遇到了相同的问题。需要使用^转义>。 - bobpaul

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