Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 每个键输出多个注册表值_Loops_Batch File_Cmd_Registry - Fatal编程技术网

Loops 每个键输出多个注册表值

Loops 每个键输出多个注册表值,loops,batch-file,cmd,registry,Loops,Batch File,Cmd,Registry,我想输出安装的每个程序的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

我想输出安装的每个程序的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查询默认只搜索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关闭
设置“KP=Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall”
PowerShell-C“GP HKLM:\%KP%\*|选择显示名称,显示版本| FT-A-H”
暂停
如果未在64位操作系统上使用此节点,则可以从第2行删除
\Wow6432Node


DisplayName
输出可能由于其字符长度和cmd.exe的缓冲区大小而被截断。可以使用以下(可能是原始)代码解决此问题:

@Echo关闭
设置“KP=Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall”
设置/A W=90,H=120
PowerShell-C“&{$H=Get Host;$R=$H.UI.RawUI;$B=$R.BufferSize;”^
“$W=$R.WindowsSize;$B.Width=如果(%W%-GT$W.Width){%W%}否则{$W.Width};”^
“$B.Height=如果(%H%-GT$W.Height){%H%}其他{$W.Height};$R.BufferSize=$B};”^
“GP HKLM:\%KP%\*|选择显示名称,显示版本| FT-A-H”
暂停
在上面的代码中,您可以根据需要调整
第3行的高度/宽度,如果您在该键下有一些很长的
显示名称或大量已安装软件,则可能需要调整