REG QUERY 获取特定 DisplayName 的 UninstallString

问题描述 投票:0回答:1
  1. 使用
    REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" /s /f "myApp"
    我确定myApp的guid。
  2. 然后使用
    REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" /S /v UninstallString
    我得到所有卸载字符串
  3. 我必须通过步骤 1 中的 guid 找到合适的卸载字符串

如何在单个 REG QUERY 命令中检索所需的卸载字符串?

我无法使用power shell,必须在cmd中管理。

cmd registry
1个回答
2
投票

直接在命令提示符窗口或运行 Windows 命令处理器的另一个程序中使用的单个命令行

%SystemRoot%\System32\cmd.exe
至少带有选项
/C
将是:

@for /F "tokens=* delims=" %I in ('%SystemRoot%\System32\reg.exe QUERY "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" /s /f "myApp" 2^>nul ^| %SystemRoot%\System32\find.exe "HKEY_LOCAL_MACHINE"') do @for /F "tokens=2*" %J in ('%SystemRoot%\System32\reg.exe QUERY "%I" /v "UninstallString" 2^>nul ^| %SystemRoot%\System32\find.exe /I "UninstallString"') do @echo %K

此命令行必须在 64 位 Windows 上执行,其中

cmd.exe
为 64 位
%SystemRoot%\System32
。否则由 32 位
%SystemRoot%\SysWOW64\cmd.exe
32 位
%SystemRoot%\SysWOW64\reg.exe
执行,导致找不到注册表项
WOW6432Node
,因为 注册表项受 WOW64 影响

cmd.exe
在安装于
C:\Windows
的 Windows 上使用以下命令行在后台启动另一个 Windows 命令处理器:

%ComSpec% /c C:\Windows\System32\reg.exe QUERY "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" /s /f "myApp" 2>nul | %SystemRoot%\System32\find.exe "HKEY_LOCAL_MACHINE"

REG 在指定项及其所有子项下不区分大小写地搜索字符串

MyApp
,并在全部找到后输出包含该字符串的注册表项和注册表值。

根本找不到 MyApp 时,REG 处理

STDERR
(标准错误)时输出的错误消息可通过使用
2>nul
将其重定向到设备 NUL 来抑制。

阅读有关 使用命令重定向运算符的 Microsoft 文档,了解

2>nul
|
的说明。重定向运算符
>
|
必须在
FOR
命令行上使用脱字符号 ^ 进行转义,以便在 Windows 命令解释器在执行执行嵌入命令的命令 FOR 之前处理此命令行时将其解释为文字字符与使用在后台启动的单独命令进程一致。

找到的MyApp

REG
的有用输出被重定向到处理命令FINDSTDIN(标准输入),该命令区分大小写地搜索字符串
HKEY_LOCAL_MACHINE
并输出包含要处理的字符串的行 cmd.exe
 的 STDOUT
(标准输出)在后台启动。包含
MyApp
的字符串值本身没有意义,这就是使用 FIND 过滤 REG 的输出的原因。

cmd.exe
处理 FOR 命令会捕获后台启动的 cmd.exe 的所有输出到
STDOUT
并逐行处理。默认情况下,使用普通空格和水平制表符作为字符串分隔符将每个非空行拆分为子字符串(标记)。如果第一个子字符串不以分号(默认行尾字符)开头,则第一个空格/制表符分隔的字符串将被分配给指定的循环变量,否则该行将被忽略以供 FOR 进一步处理。这里不需要这种行为,因为注册表项肯定包含空格字符。
tokens=* delims=
通过定义空字符串分隔符列表来禁用行分割行为。
tokens=*
并不是真正必要的,但可以使捕获的行的处理速度更快一些。

具有包含

MyApp
的字符串值的整个注册表项被分配给循环变量
I
。该字符串用于再运行一次 FOR /F 在后台再运行一次 CMD 运行 REG 以获取输出注册表字符串值的字符串
UninstallString
以及包含该值的注册表项已知。 FIND 再次用作过滤器,仅输出包含不区分大小写的
UninstallString
的行以进行进一步处理。

Windows Vista 和更高版本的 Windows 输出的

REG 和以空格分隔的字符串值名称

UninstallString
,值类型很可能是
REG_SZ
(也可能是
REG_EXPAND_SZ
)以及通常还包含一个或更多空间。这次使用 FOR /F 选项
tokens=2*
来分配给指定的循环变量
J
不进一步处理的值类型以及带有空格的整个字符串值到下一个循环变量
K
根据到 ASCII 表。

@echo %K
可以仅替换为
@%K
来执行卸载命令,而不是仅将其写入到 cmd.exe
STDOUT
处理整个命令行。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • cmd /?
  • echo /?
  • find /?
  • for /?
  • reg /?
  • reg query /?
© www.soinside.com 2019 - 2024. All rights reserved.