我正在编写一个批处理脚本来更新软件包(卸载旧版本 版本/安装新的)。这需要通过网络完成 有500台PC需要更新。卸载之前的第一步是检查是否安装了软件。为了检查一下 我查询注册表:
reg query "HKLM\SOFTWARE\A.E.T Europe B.V."
此查询在本地运行时(出于测试目的)提供了相应的结果,但是当我远程运行时(它们将会是 ran)返回错误的结果。
reg query "\\I301\HKLM\SOFTWARE\A.E.T Europe B.V."
如果我在本地运行该行,返回0。但是,如果我登录I301并运行 本地查询返回1,这是A.E.T Europe B.V.在Windows注册表中的Wow6432Node分支下显示的事实。
为什么??? ???
提前致谢!
答案 0 :(得分:3)
如果在Windows x64上只有密钥
HKLM\SOFTWARE\Wow6432Node\A.E.T Europe B.V.
但没有钥匙
HKLM\SOFTWARE\A.E.T Europe B.V.
导致不同结果的原因很可能是由批处理文件或命令行执行的reg.exe
版本。
如果在处理批处理文件时执行64位%SystemRoot%\System32\reg.exe
或使用行<64> %SystemRoot%\System32\cmd.exe
运行命令,则找不到密钥
reg query "\\I301\HKLM\SOFTWARE\A.E.T Europe B.V."
但是如果在处理批处理文件时执行了32位%SystemRoot%\SysWOW64\reg.exe
,或者在使用行
%SystemRoot%\SysWOW64\cmd.exe
运行命令,则会找到密钥
reg query "HKLM\SOFTWARE\A.E.T Europe B.V."
因为对于32位应用程序,HKLM\SOFTWARE
的注册表访问权限被注册表重定向器重定向到HKLM\SOFTWARE\Wow6432Node
。
检查两个可能的关键位置:
@echo off
%SystemRoot%\System32\ping.exe -n 1 I301 >nul
if errorlevel 1 (
echo Computer with name I301 is not available in network.
goto :EOF
)
%SystemRoot%\System32\reg.exe query "\\I301\HKLM\SOFTWARE\A.E.T Europe B.V." >nul 2>&1
if not errorlevel 1 goto Installed
%SystemRoot%\System32\reg.exe query "\\I301\HKLM\SOFTWARE\Wow6432Node\A.E.T Europe B.V." >nul 2>&1
if not errorlevel 1 goto Installed
echo A.E.T Europe B.V. is not installed.
goto :EOF
:Installed
echo A.E.T Europe B.V. is installed already.
另请参阅Microsoft文章:
答案 1 :(得分:1)
Mofi的回答很好。在64位系统上,您也可以考虑使用
/ reg:32&amp; / REG:64 请参阅REG QUERY /?
如果从其他应用启动CMD.exe,有时会遇到麻烦。如果该应用程序是32位应用程序,它将启动32位版本的CMD.exe
答案 2 :(得分:0)
感谢Mofi和RGuggisberg,
在当天晚些时候发现了Mofi所说的一切(以及RGuggisberg的补充)。由于我无法使其工作,我尝试在注册表中检查Uninstall条目,认为它将存在并且仅在那里。在得到类似的结果后,我做了一些谷歌搜索,发现Windows在注册表中有两棵树:一个用于32位应用程序,另一个用于64位应用程序。暗示由:
给出最后,它显示了RGuggisber提到/注册的两个选项:32&amp; / REG:64。看了他们,发现两个注册表的存在。
尝试相同的查询(卸载)但是使用/ reg:64找到了我正在寻找的密钥。试过/ reg:32但实际上找不到它。我运行脚本的机器运行Windows 7 32位。远程机器Windows 8.1 64位。