差异 REG QUERY 本地与远程计算机批处理脚本

Discrepancy REG QUERY local vs remote computer batch script

我正在编写批处理脚本来更新软件包(卸载旧的 版本/安装新版本)。这需要通过网络完成,因为 有 500 台电脑要更新。卸载前的第一步是检查是否安装了该软件。为了检查 我查询注册表:

reg query "HKLM\SOFTWARE\A.E.T Europe B.V."

当 运行 在本地(出于测试目的)时,此查询给出了适当的结果,但是当我 运行 它远程时(他们会这样 运行) returns 错误的结果。

reg query "\I301\HKLM\SOFTWARE\A.E.T Europe B.V."

returns 0 如果我 运行 那条线在本地。但是如果我登录 I301 并且 运行 本地查询returns 1、正在A.E.T欧洲B.V的真相。显示在 windows 注册表中的 Wow6432Node b运行ch 下。

这是为什么???

提前致谢!

如果在 64 位 Windows 上只有密钥

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的命令[=25]时找不到密钥=]

reg query "\I301\HKLM\SOFTWARE\A.E.T Europe B.V."

但是如果在处理批处理文件时执行32位%SystemRoot%\SysWOW64\reg.exe或者运行使用32位%SystemRoot%\SysWOW64\cmd.exe的命令[=25] =]

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 文档页面:

Mofi 的回答很好。在 64 位系统上,您还可以考虑使用

/reg:32 & /reg:64 请参阅注册查询 /?

如果您从其他应用启动 CMD.exe,有时会遇到麻烦。如果该应用程序是 32 位应用程序,它将启动 CMD.exe

的 32 位版本

感谢 Mofi 和 RGuggisberg,

发现当天晚些时候 Mofi 所说的一切(RGuggisberg 补充)。因为我无法让它工作,所以我尝试检查注册表中的 Uninstall 条目,认为它会存在并且只会存在。再次获得类似的结果后,我做了更多的谷歌搜索,发现 Windows 在注册表中有两棵树:一个用于 32 位应用程序,另一个用于 64 位应用程序。提示来自:

最后它显示了 RGuggisber 提到的两个选项 /reg:32 和 /reg:64。查找它们,发现两个注册表都存在。

使用 /reg:64 尝试了相同的查询(已卸载),但找到了我正在寻找的密钥。用 /reg:32 试过,确实找不到。我是 运行 脚本的机器运行 Windows 7 32 位。远程机器Windows 8.1 64位.