需要从32位和64位的Windows机器中读取注册表值

4
我需要使用 .cmd 文件读取一些注册表键值。我正在使用以下命令来完成这个任务。
FOR /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Looptest" /v "tscFile"') do set "TSCFile=%%b"

问题是,当我在32位系统上安装软件时,注册表的路径为:"HKLM\SOFTWARE\Looptest",而当我在64位系统上安装软件时,路径变为:"HKLM\SOFTWARE\Wow6432Node\Looptest"
有没有一种方法可以在不知道操作系统版本的情况下读取键?
当然,我知道最初可以检查操作系统版本,然后编写相应的代码。但是,除此之外,还有其他方法吗?
谢谢!

使用批处理文件并检测您的架构以使用“SYSNATIVE”目录。我认为在批处理脚本中使用REG时无法避免预检测例程。 https://social.technet.microsoft.com/Forums/systemcenter/en-US/8cf5110c-3a57-4c78-b52c-ee7c04e8fc85/reg-query-pointing-to-wow6432node-instead-of-the?forum=configmgrgeneral - Hernán
3个回答

4

执行 REQ QUERY /? 命令并注意 /reg:32 和 /reg:64 开关。然后在你的批处理文件开头添加以下内容(在进行任何注册表操作之前),以便它可以在 32 位或 64 位机器上正常工作。

set "Reg32="
set "Reg64="
if defined Programfiles(x86) set "Reg64=/reg:64" & set "Reg32=/reg:32"

这样做的额外优点是,您可以通过使用适当的Regnn变量来指定64位机器上的32位或64位注册表区域,以进行注册表操作。假设您在64位机器上时想要使用64位注册表区域,则示例将变为:

FOR /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Looptest" /v "tscFile" %Reg64%') do set "TSCFile=%%b"

因为在32位机器上未定义%Reg64%,所以你的代码也能在那里正确运行。


非常感谢您的建议。虽然这并没有完全解决我的问题,但是这个答案确实帮助我解决了这个问题。非常感谢! - Srijani Ghosh

1

在参考了RGuggisberg的回答后,我将我的代码改成了这样:

@echo off 

set replacementString=
if defined Programfiles(x86) set "replacementString=Wow6432Node\"


FOR /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\%replacementString%Looptest" /v "tscFile"') do set "TSCFile=%%b"

echo %TSCFile%

谢谢!


0

简短回答:不行。

长篇回答:当运行32位进程(透明重定向)时,Windows x64版本会自动决定从Wow6432节点读取。因此,如果您能确保您的命令在32位进程中运行,您可以依靠该机制,而无需担心Wow6432节点。

如果您的命令作为64位进程运行,则必须自己查找正确的位置。

您可以通过调用%windir%\SysWoW64\cmd.exe在64位Windows上运行32位cmd。不幸的是,32位Windows上缺少SysWoW64文件夹,因此您必须提前做出决策...


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