需要从 32 位和 64 位机器 Windows 机器读取注册表值
Need to read registry value from both 32 bit and 64 bit machine Windows machine
我需要使用 .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"
有没有办法在不知道 OS 版本的情况下读取密钥?
当然我知道最初我可以检查 OS 版本,然后可以相应地编写代码。但是,除此之外,还有其他方法吗?
谢谢!
简答:没有。
长答案:Windows当运行宁 32 位进程(透明重定向)时,x64 版本将自动决定从 Wow6432 节点读取。因此,如果您可以确保您的命令在 32 位进程中是 运行,您就可以依赖该机制,而不必为 Wow6432 节点操心。
如果你的命令运行是64位进程,你得自己找合适的地方。
您可以通过调用 %windir%\SysWoW64\cmd.exe
在 64 位 windows 上 运行 32 位 cmd。不幸的是,SysWoW64 文件夹在 32 位 windows 上丢失,因此您必须提前一步做出决定...
做 REQ QUERY /?并注意 /reg:32 和 /reg:64 开关。然后将类似的内容添加到 bat 文件的开头(在执行任何 reg 操作之前),以便它可以在 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"
并且由于 %Reg64% 未在 32 位计算机上定义,您的代码也可以在那里正常工作。
从 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%
谢谢!
我需要使用 .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"
有没有办法在不知道 OS 版本的情况下读取密钥?
当然我知道最初我可以检查 OS 版本,然后可以相应地编写代码。但是,除此之外,还有其他方法吗?
谢谢!
简答:没有。
长答案:Windows当运行宁 32 位进程(透明重定向)时,x64 版本将自动决定从 Wow6432 节点读取。因此,如果您可以确保您的命令在 32 位进程中是 运行,您就可以依赖该机制,而不必为 Wow6432 节点操心。
如果你的命令运行是64位进程,你得自己找合适的地方。
您可以通过调用 %windir%\SysWoW64\cmd.exe
在 64 位 windows 上 运行 32 位 cmd。不幸的是,SysWoW64 文件夹在 32 位 windows 上丢失,因此您必须提前一步做出决定...
做 REQ QUERY /?并注意 /reg:32 和 /reg:64 开关。然后将类似的内容添加到 bat 文件的开头(在执行任何 reg 操作之前),以便它可以在 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"
并且由于 %Reg64% 未在 32 位计算机上定义,您的代码也可以在那里正常工作。
从 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%
谢谢!