【问题标题】:Discrepancy REG QUERY local vs remote computer batch script差异 REG QUERY 本地与远程计算机批处理脚本
【发布时间】:2015-12-16 11:47:24
【问题描述】:

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

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 分支下的事实。

为什么会这样???

提前致谢!

【问题讨论】:

    标签: windows batch-file remote-registry


    【解决方案1】:

    如果在 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 运行命令,则找不到密钥

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

    但是如果在处理批处理文件时执行 32 位 %SystemRoot%\SysWOW64\reg.exe 或在使用该行时通过 32 位 %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 文档页面:

    【讨论】:

      【解决方案2】:

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

      /reg:32 & /reg:64 请参阅 REG QUERY /?

      如果您从另一个应用程序启动 CMD.exe,有​​时会遇到麻烦。如果该应用程序是 32 位应用程序,它将启动 32 位版本的 CMD.exe

      【讨论】:

        【解决方案3】:

        感谢 Mofi 和 RGuggisberg,

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-07
          • 1970-01-01
          • 2022-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多