Batch file Windows批处理:将查询键值注册为变量,但如果键值不为';不存在

Batch file Windows批处理:将查询键值注册为变量,但如果键值不为';不存在,batch-file,Batch File,我有下面的批处理命令,它获取注册表项并为变量赋值,但当注册表项不存在时,它会显示错误 for /f "tokens=2,*" %%a in ('reg query HKLM\Software\MySoftware\1.0\MyExecutable /v "InstallDir" ^| findstr InstallDir') do set InstallPath=%%b 有没有绕过异常的方法?我尝试在reg查询之后或命令末尾使用2>NUL,但此时出现异常2>。 非常感谢您的帮助/指导在reg查

我有下面的批处理命令,它获取注册表项并为变量赋值,但当注册表项不存在时,它会显示错误

for /f "tokens=2,*" %%a in ('reg query HKLM\Software\MySoftware\1.0\MyExecutable /v "InstallDir" ^| findstr InstallDir') do set InstallPath=%%b
有没有绕过异常的方法?我尝试在reg查询之后或命令末尾使用2>NUL,但此时出现异常2>。


非常感谢您的帮助/指导

在reg查询之后,您把它放在了哪里?这应该有效(在findstr之前查看):


你应该像解决管道一样解决这个问题<代码>^ |
只需将其转义到
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)

Doh!我没有想到逃跑这个角色。感谢您指出它。请注意,此方法仅在您查找的值的名称中没有空格时有效。假设有一个名为
Product Version
的值,那么/f“tokens=2,*”的
就会变得混乱。@Tomalak你是对的,但是你知道你的值包含多少空格,你可以将
tokens=2,*
更改为
tokens=2+,*
这通常归结为:在批处理文件中做基本的工作很困难,做任何远程高级的事情都是一件让人头疼的事。不过,添加得不错。有趣的是,我想到了escape char,但我预先构造了要在环境变量中执行的命令。执行此操作时,需要在变量中加倍转义(^^>),以便转义重定向显示在for命令中。谢谢你给我指这个。此外,您不需要找到右行,您可以指定tokens=1,2,*然后用于…%%如果%%a==InstallDir set InstallPath=%%%c,则a in(…)do会遇到与其问题相同的问题。>需要使用^转义。
for /f "tokens=2,*" %%a in ('reg query HKLM\Software\MySoftware\1.0\MyExecutable /v "InstallDir" 2^>NUL ^| findstr InstallDir') do set InstallPath=%%b