每个键输出多个注册表值
问题描述:
我想输出安装的每个程序的DisplayName和DisplayVersion。每个键输出多个注册表值
for /f "tokens=2*" %a in (
'reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s^
| findstr /c:"DisplayName" /c:"DisplayVersion"'
) do @echo %b
它确实输出二者每行一个,但我想在一行中显示出来的,你会怎么做呢?
> DisplayName, DisplayVersion
答
您可能应该检查32位和64位注册表。如果我没有指定哪一个,那么我的REG QUERY默认只搜索64位。
并非所有的程序键都具有DisplayName和/或DisplayVersion。
如果DisplayName不存在,则下面的代码列出完整的关键字,如果DisplayVersion不存在,则列出一个空的版本。搜索32位和64位注册表。
@echo off
setlocal enableDelayedExpansion
set "key="
set "name="
set "ver="
for %%s in (32 64) do (
for /f "delims=" %%A in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s /reg:%%s 2^>nul') do (
set "ln=%%A"
if "!ln:~0,4!" equ "HKEY" (
if defined name (echo "!name!","!ver!") else if defined key echo "!key!","!ver!"
set "name="
set "ver="
set "key=%%A"
) else for /f "tokens=1,2*" %%A in ("!ln!") do (
if "%%A" equ "DisplayName" set "name=%%C"
if "%%A" equ "DisplayVersion" set "ver=%%C"
)
)
)
if defined name (echo "!name!","!ver!") else if defined key echo "!key!","!ver!"
答
最简单的方法是只输出直接的信息,在Windows PowerShell中,但是这将是直接违背你已经应用到这个问题的标签。
这里因此是使用PowerShell中的批处理文件:
@Echo Off
Set "KP=Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
PowerShell -C "GP HKLM:\%KP%\*|Select DisplayName,DisplayVersion|FT -A -H"
Pause
如果你不使用这个在64位操作系统你可以从line 2
删除\Wow6432Node
。
有可能被截断的DisplayName
输出由于其字符长度和CMD.EXE的缓冲区大小。这可以围绕使用以下,(可能粗),代码被加工:
@Echo Off
Set "KP=Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
Set/A W=90,H=120
PowerShell -C "&{$H=Get-Host;$R=$H.UI.RawUI;$B=$R.BufferSize;"^
"$W=$R.WindowSize;$B.Width=If (%W% -GT $W.Width) {%W%} Else {$W.Width};"^
"$B.Height=If (%H% -GT $W.Height) {%H%} Else {$W.height};$R.BufferSize=$B};"^
"GP HKLM:\%KP%\*|Select DisplayName,DisplayVersion|FT -A -H"
Pause
在上面的代码可以根据需要调整上line 3
即高度/宽度,这可能如果你有一些是必要的非常长的DisplayName
's或在该密钥下安装的软件的巨大列表。