2017-10-19 100 views
0

我想輸出安裝的每個程序的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 

回答

1

您可能應該檢查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!" 
0

最簡單的方法是隻輸出直接的信息,在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或在該密鑰下安裝的軟件的巨大列表。