我试过问这个,但我觉得有些混乱,所以我要试试这个新鲜的。这是代码:
set regVar=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
set excluded=Microsoft MDOP Dell
set count=0
for /f "tokens=2,*" %%a in ('Reg Query %regVar% /S^|find " DisplayName" ^| findstr /v "%excluded%"') do (
set /a count+=1
setlocal EnableDelayedExpansion
for %%n in (!count!) do (
endlocal
set product[%%n]=%%b
echo %%n.%tab%%%b
echo %%a
)
)
这样做是遍历所有卸载注册表,然后将每个 DisplayName 键添加到名为 product[] 的数组中,然后将其在循环中的当前编号的结果打印到屏幕上以获取菜单。然后你可以做的是输入数字,它会返回该数组中的显示名称:
因此,就目前而言,它过滤掉了所有 microsoft、mdop 和 dell
我想要它做的是还查看那个 DisplayName 的键并返回另一个名为 UninstallString 的键,并将其分配给具有相同关联索引的数组 uninstallprod[]。我遇到的问题是我无法弄清楚如何使用 sql 中的语句进行查询
Select UninstallString from REGISTRY where DisplayName="Program name"
程序名称是从您选择的 DisplayName 返回的字符串,或者有一个 SINGLE 查询,这将允许我像您在上面看到的那样过滤掉 DisplayNames,并在同一语句中包含 UninstallString 值。以任何其他方式尝试它的问题是我无法过滤并执行两个数组而没有它以完全错误的索引结束(它会跳过显示名称但仍然分配卸载字符串,因为它不允许我过滤两者)
更新:
在这一点上,我让它拉回了 DisplayName 和 Uninstall 字符串,但它没有正确推进计数器。在当前状态下,它分配了 2 个变量,用于分配和比较键是什么的键的名称 (%%a),以及作为程序名称的键的值 (%%c)或稍后在脚本中用于卸载的卸载路径(字符串)。所以最终发生的事情是我最终得到了一个跳过的数字列表,因为即使没有显示名称被打印到列表中,计数器也在前进。这是我现在正在使用的代码。
@echo off
set tab=
set regVar=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
set excluded=Microsoft MDOP Dell
set count=1
for /f "tokens=1,2,*" %%a in ('Reg Query %regVar% /S^|findstr "DisplayName UninstallString" ^| findstr /v "%excluded%"') do (
setlocal EnableDelayedExpansion
for %%n in (!count!) do (
endlocal
if "%%a"=="DisplayName" set product[%%n]=%%c&echo %%n.%tab%%%c
if "%%a"=="UninstallString" if defined product[%%n] set uninstall[%%n]==%%c&set/a count+=1
)
)
举个例子,我的列表中有 Sublime Text 2.0.1 和 64 位 HP CIO Components Installer。最终发生的是我得到一个这样的列表:
1. Sublime Text 2.0.1
3. 64 bit HP CIO Components Installer
因此,由于某种原因,即使没有定义产品 [2],计数器也会超过 2。在 32 位版本中,我显示了 5 个条目,其中一个是空白的,打印如下:
1. Adobe Flash Player 11 ActiveX
2. Google Chrome
3. TeamViewer 8
4.
4. Google Update Helper.