首页 > 解决方案 > 如何从 Windows 注册表中获取 Windows 的产品名称?

问题描述

我需要使用 Windows 命令获取注册表项中的值。

例如:

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | findstr "REG_")

它输出:

ProductName    REG_SZ    Windows 7 Home Premium

我只需要字符串Windows 7 Home Premium

标签: cmd

解决方案


带有选项的命令FOR/F可用于将命令或可执行文件的输出分配给环境变量。

在批处理文件中使用:

for /F "skip=2 tokens=1,2*" %%I in ('%SystemRoot%\System32\reg.exe query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName 2^>nul') do if /I "%%I" == "ProductName" set "WindowsProduct=%%K"

在命令提示符窗口中使用:

for /F "skip=2 tokens=1,2*" %I in ('%SystemRoot%\System32\reg.exe query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName 2^>nul') do if /I "%I" == "ProductName" set "WindowsProduct=%K"

FOR在后台启动另一个命令进程,%ComSpec% /c括号中的命令行作为附加参数附加。所以开始是安装 Windows 到C:\Windows

C:\Windows\System32\cmd.exe /c C:\Windows\System32\reg.exe query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName 2>nul

可执行文件的输出reg.exeFOR捕获并在启动后逐行处理,在终止cmd.exe后自行关闭。reg.exe

阅读有关使用命令重定向运算符的Microsoft 文章,了解2>nul. 当 Windows 命令解释器在执行命令FOR之前在后台启动的单独命令进程中执行嵌入式命令行时,重定向运算符>必须^FOR命令行上使用脱字符进行转义,以将其解释为文字字符。reg

reg在 Windows Vista 和更高版本的 Windows 上的输出例如是:


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
    ProductName    REG_SZ    Windows 7 Home Premium

所以首先有一个空行输出,接下来是带有注册表项的行,然后是带有空格的感兴趣值的行ProductNameREG_SZWindows 7 Home Premium,最后一个空行。

但在 Windows XP 上的输出不同:


! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
    ProductName REG_SZ  Microsoft Windows XP

reg.exe在 Windows XP 上,还有一个额外的带有两行输出的标题。与 Windows Vista 和更高版本的 Windows 上的输出相比,在 and之间有一个水平制表符ProductNameREG_SZ一个制表符,REG_SZMicrosoft Windows XP不是空格。reg.exe

在使用FOR处理捕获的输出时会考虑这些差异。

由于使用了选项,因此跳过了前两行,skip=2这意味着在 Windows Vista 和更高版本的 Windows 上,由FOR处理的第一行已经是具有感兴趣值的行。但是在 Windows XP 上处理的第一行是第三行,它是一个空行。FOR总是忽略空行。

因此,在 Windows XP 上FOR处理的下一行是带有注册表项的行。使用默认分隔符普通空格和水平制表符将其拆分为子字符串,这意味着这里根据ASCII 表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows将其分配给指定的循环变量I和下一个循环变量,因为 option 。NT\CurrentVersiontokens=1,2*

因此,在 Windows XP 上,执行IF条件以不区分大小写比较分配给循环变量的字符串,IProductName这种情况下,该字符串的计算结果为 false。

reg然后在 Windows XP 上的第五行输出的处理与reg在 Windows Vista 和更高版本的 Windows 上的第三行输出一样。

具有感兴趣值的行被分成三个子字符串。第一个空格/制表符分隔ProductName的字符串分配给指定的循环变量I。第二个空格/制表符分隔REG_SZ的字符串分配给循环变量J。由于在选项字符串after的末尾,空格/制表符之后的其余行REG_SZ被完全分配给下一个但一个循环变量的空格。K*tokens=1,2*2

该行的IF条件为真,因此将感兴趣的字符串值分配给环境变量WindowsProduct

最后一个空行再次被FOR忽略。

WindowsProduct因此,如果在 Windows 注册表中完全找到了感兴趣的字符串值,那么最后会使用感兴趣的字符串值定义环境变量。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • for /?
  • if /?
  • reg /?
  • reg query /?
  • set /?

推荐阅读