我在写一个批处理脚本来更新一个软件包(卸载旧版本/安装新的)。 这需要通过networking完成,因为有500台PC需要更新。 卸载之前的第一步是检查是否安装了软件。 为了检查我查询registry:
reg query "HKLM\SOFTWARE\AET Europe BV"
这个查询在本地运行时(为了testing目的)给出了正确的结果,但是当我远程运行它(它们将会运行)返回错误的结果。
reg query "\\I301\HKLM\SOFTWARE\AET Europe BV"
如果我在本地运行该行返回0。 但是,如果我login到I301并在本地运行查询返回1,是AET Europe BV显示在Windowsregistry中的Wow6432Node分支下的事实。
这是为什么???
提前致谢!
如果在Windows x64上只有密钥
HKLM\SOFTWARE\Wow6432Node\AET Europe BV
但没有关键
HKLM\SOFTWARE\AET Europe BV
导致不同结果的原因很可能是由批处理文件或命令行执行哪个版本的reg.exe
引起的。
如果在处理批处理文件时执行64位%SystemRoot%\System32\reg.exe
或者在使用该行时通过64位%SystemRoot%\System32\cmd.exe
运行命令,则找不到密钥
reg query "\\I301\HKLM\SOFTWARE\AET Europe BV"
但如果32位%SystemRoot%\SysWOW64\reg.exe
在处理批处理文件或运行32位%SystemRoot%\SysWOW64\cmd.exe
时使用行
reg query "HKLM\SOFTWARE\AET Europe BV"
因为对于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\AET Europe BV" >nul 2>&1 if not errorlevel 1 goto Installed %SystemRoot%\System32\reg.exe query "\\I301\HKLM\SOFTWARE\Wow6432Node\AET Europe BV" >nul 2>&1 if not errorlevel 1 goto Installed echo AET Europe BV is not installed. goto :EOF :Installed echo AET Europe BV is installed already.
另请参阅Microsoft文章:
Mofi很好的回答。 在64位系统上,你也可以考虑使用
/ reg:32&/ reg:64请参阅REG QUERY /?
如果您从其他应用程序启动CMD.exe,有时可能会遇到麻烦。 如果该应用程序是一个32位应用程序,它将启动CMD.exe的32位版本
感谢Mofi和RGuggisberg,
在当天晚些时候发现了Mofi所说的一切(和RGuggisberg的补充)。 由于我无法做到这一点,我试图检查在注册表中的卸载条目,认为它会在那里,只有在那里。 在得到类似的结果后,我做了一些更多的搜索,发现Windows有两棵树在注册表中:一个用于32位应用程序,另一个用于64位。 提示是由:
最后它显示了RGuggisber提到的两个选项/ reg:32&reg:64。 看着他们,发现两个登记处的存在。
尝试相同的查询(用于卸载),但使用/ reg:64,并找到了我正在寻找的关键。 用/ reg:32试过,实在找不到。 运行Windows 7 32位的脚本的机器。 远程计算机Windows 8.1 64位。