cmd - 如何从 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
。
解决方案
带有选项的命令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.exe
由FOR捕获并在启动后逐行处理,在终止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
所以首先有一个空行输出,接下来是带有注册表项的行,然后是带有空格的感兴趣值的行ProductName
,REG_SZ
和Windows 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之间有一个水平制表符ProductName
和REG_SZ
一个制表符,REG_SZ
而Microsoft 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\CurrentVersion
tokens=1,2*
因此,在 Windows XP 上,执行IF条件以不区分大小写比较分配给循环变量的字符串,I
在ProductName
这种情况下,该字符串的计算结果为 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 /?
推荐阅读
- linux - If语句将变量与列表中的文件进行比较
- ios - iOS 13 模拟器中的“找不到 MIDI 网络驱动程序”崩溃
- python - 如何向用户显示类别
- html - dompdf laravel if 1 div page break 2nd 从新页面开始如何防止?
- angular - Ionic - 使用 ion-toggle 切换功能
- python - Django计算人口金字塔的百分比
- spring-boot - How to convert plain java main method program on docker
- xml - 如何重新分发 MSXML 库?
- java - 为什么我在更换 Arial Narrow 时会得到额外的符号?
- ansible - 使用 Ansible 按第二个列表的特定顺序映射 Debian 软件包列表