从 CLI(或 .bat 文件)检测路径中带有空格的注册表项?

从 CLI(或 .bat 文件)检测路径中带有空格的注册表项?

我遇到了一个问题,我的经验(和 Google-fu)让我失望了。

基本上,我需要努力KB968730大约有几百个客户端。当然,在开始安装之前,我想检查一下修补程序的安装情况。遗憾的是,我需要使用脚本和 GPO 来执行此操作,而不是使用像 SCCM 这样的适当系统。通常不会给我带来任何问题,但似乎有一个问题。

问题是,此修补程序安装的注册表项路径中有一个该死的空格。具体来说,它安装到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix\KB968730

因此,标准批处理文件/CMD 命令reg.exe query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix\KB968730会抛出语法错误并弄乱批处理文件的安装检查部分,这并不令人意外 - 它将路径的第二部分视为第二个参数。因此,我当然尝试将路径封装在双引号中,但无济于事。单引号,也无济于事。威胁我的操作系统和/或 Microsoft 也无济于事。

经过一番谷歌搜索和咒骂之​​后,我找到了一个看似可以解决这个问题的方法,但由于某种原因,我无法弄清楚,它无法完全发挥作用。(毫无疑问,因为我最近的编码技能很弱,字符串标记化在最好的情况下也让我感到困惑。)

好像我想要使用的是类似的东西:

for /f "Tokens=2,*" %%a in (‘reg.exe "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix\KB968730" /v Path’) do (set xpath=%%a)然后使用%xpath%,但不起作用。将 tokens 设置为 1 会给我空格前的路径,设置为 2 会给我空格后的路径,我不知道如何将一个值附加到另一个值。特别令人沮丧,因为我看到的所有答案都说“谢谢,它起作用了!!!”或类似的话。*(请注意,%在命令行上直接执行时要删除一个。)

有谁知道我在这里搞砸了什么吗?

或者,如果有人仍然使用 VBS 并且知道如何使用它,我会很乐意选择这个选项。(但是,没有 PowerShell,因为我们的 XP 客户端没有安装它。)

附言:如果这更适合 StackOverflow,我不介意迁移它,但我最初的想法是“我们”不喜欢开发人员来这里询问(向我们)关于设置他们的开发机器的琐碎问题,所以我想他们可能也会对我的问题有同样的感受。

答案1

对于包含空格的注册表路径,双引号似乎可以正常工作。我刚刚在 Windows XP SP3 上进行了测试。以下内容返回预期的键/值:

REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"

如果你想使用令牌,你需要使用delims选项来指定不是使用空格/制表符作为分隔符。来自FOR /?

   delims=xxx      - specifies a delimiter set.  This replaces the
                     default delimiter set of space and tab.

;使用作为分隔符的简单批处理示例。

FOR /F "usebackq delims=;" %%A IN (`REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix\KB968730" /v Path`) DO (
    SET XPATH=%%A
)

此外,您可能会发现wmic实用工具很有用。它随 XP 一起提供,并使用 WMI 来完成工作。您可以使用以下方法快速检查您的 KB:

wmic qfe list brief | FIND /I "KB968730"

相关内容