2017-10-19 53 views
0

Je souhaite afficher à la fois DisplayName et DisplayVersion de chaque programme installé.Sortie de plusieurs valeurs de registre par clé

for /f "tokens=2*" %a in (
    'reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s^
    | findstr /c:"DisplayName" /c:"DisplayVersion"' 
) do @echo %b 

Il sort les deux un par ligne mais je veux les afficher sur une ligne, comment le feriez-vous?

> DisplayName, DisplayVersion 

Répondre

1

Vous devriez probablement vérifier les registres 32 bits et 64 bits. Si je ne spécifie pas lequel, mon REG QUERY recherche seulement 64bit par défaut.

Toutes les clés de programme n'ont pas DisplayName et/ou DisplayVersion.

Le code ci-dessous répertorie la clé complète si DisplayName n'est pas présent et liste une version vide si DisplayVersion n'est pas présent. Les registres 32 bits et 64 bits sont recherchés.

@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

La méthode la plus simple serait de sortie uniquement les informations directement dans Windows PowerShell, mais qui serait directement contraire aux balises que vous avez appliqué à cette question.

Voici donc un fichier de commandes qui utilise Powershell:

@Echo Off 
Set "KP=Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" 

PowerShell -C "GP HKLM:\%KP%\*|Select DisplayName,DisplayVersion|FT -A -H" 
Pause 

Vous pouvez retirer \Wow6432Node de line 2 si vous ne l'utilisez ceci sur un système d'exploitation 64 bits.


Il est possible pour la sortie DisplayName à tronquée en raison de leur longueur de caractères et de buffersize de cmd.exe. Cela peut être contourné en utilisant ce qui suit, (éventuellement brut), code:

@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 

Dans le code ci-dessus, vous pouvez régler cette hauteur/largeur sur line 3 selon les besoins, cela peut être nécessaire si vous avez des très longue DisplayName ou une énorme liste de logiciels installés sous cette clé.