批处理脚本的Reg Query脚本

时间:2013-04-12 19:59:52

标签: batch-file

我试过这个问过一次,但我觉得有些困惑所以我会尝试这个新鲜的。这是代码:

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组件安装程序。最终发生的事情是我得到一个这样的列表:

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.

1 个答案:

答案 0 :(得分:2)

你需要让“UninstallString”和“Displayname”通过初始门,所以改变

for / f“tokens = 2,*”%% a in('Reg Query%regVar%/ S ^ | find“DisplayName”“...

for / f“tokens = 1,2,*”%% a in('Reg Query%regVar%/ S ^ | FINDSTR“Displayname UninstallString”...

这会将%%a设置为DisplaynameUninstallString%%c为所需的数据值。

然后你必须处理序列

Displayname x
Displayname y
卸载y

Displayname y
卸载y
卸载z

实际上并不是特别难。

您已经设置了Product [n] - 您需要为每个%%a == Displayname执行此操作。 重复安装[n] - 只有在定义了Product [n]时才为每个%%a == UninstallString执行此操作。

IF "%%a"=="UninstallString" if defined Product[%%n] set uninstall[%%n]=%%c&set/a count+=1

在SETLOCAL输出之前取计数增量,因为只有当你有一对匹配的PRODUCT和UNINSTALL时才需要这样做;将您的初始值更改为1(除非您喜欢从零开始计算)

并祈祷你没有得到序列

Displayname y
卸载z

现在,如果你得到这个序列,只需找到一个方便的字符串来通过门 - 也许是“HKEY_”,如果%%a开始“HKEY_”然后set "Product[%%n]="清除任何出现没有卸载字符串的Displayname。

您甚至可能希望稍微改变一下。

如果您设置

  • 针对第一个Displayname的产品
  • 针对第一个卸载字符串卸载(即仅if not defined unistall[%%n]
  • 当出现HKEY_时,如果产品[%% n]和。%,则递增计数器 卸载[%% n]已定义,否则设置产品[%% n]并卸载[%% n] [没什么]

那么卸载和displayname的顺序是不相关的,虽然你需要在循环之后重复HKEY_测试来处理最后一个实例......


解决所讨论的一些问题的附录

@ECHO OFF
setlocal
set regVar=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
set excluded=/c:" Microsoft" /c:"MDOP" /c:"Dell" 
set count=1
for /f "tokens=1,2,*" %%a in ('Reg Query %regVar% /S^|findstr "DisplayName HKEY_ UninstallString" ^| findstr /v %excluded%') do (
    setlocal EnableDelayedExpansion
    for %%n in (!count!) do (
        ENDLOCAL
        SET HKEY=Y
        IF "%%a"=="DisplayName" SET "HKEY="&set product[%%n]=%%c
        IF "%%a"=="UninstallString" SET "HKEY="&IF NOT DEFINED uninstall[%%n] set uninstall[%%n]=%%c
        IF "%%a"=="QuietUninstallString" SET "HKEY="&IF NOT DEFINED uninstall[%%n] set uninstall[%%n]=%%c
    IF DEFINED hkey IF DEFINED product[%%n] IF defined uninstall[%%n] SET /a count+=1&SET "hkey="
    IF DEFINED hkey set "product[%%n]="&SET "uninstall[%%n]="
    )   
)

::
:: Last entry may not be complete
::
IF NOT DEFINED product[%count%] SET "uninstall[%count%]="&SET /a count-=1
IF NOT DEFINED uninstall[%count%] SET "product[%count%]="&SET /a count-=1

ECHO %count% entries found
SET prod
SET unins

请注意,因为HKEY现在允许通过门,但测试line beginning HKEY是一件痛苦的事,如果它不是字符串“Displayname”,“UninstallString”或“QuietUninstallString”之一那么它是推定是HKEY。 IF DEFINED适用于RUN-TIME存在/不存在的变量,该变量允许简单的koff编程。


显示“数组”中的数据

FOR /l %%i IN (1,1,%count%) DO (
CALL ECHO %%i. %%product[%%i]%%
)

其他数据20130419-1756Z

@echo OFF
setlocal
set tab=    
set regVar=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
set excluded=Microsoft MDOP Dell 
FOR /f "delims=" %%i IN ('Reg Query %regVar% /S^|find "HKEY_"') DO (
 FOR %%s IN (dn us qu pu dn ut) DO SET "%%s="
 FOR /f "tokens=1,2,*delims= " %%s IN ('Reg Query "%%i" /S') DO (
  if /i "%%s"=="Displayname" SET /a dn+=1&SET dn=%%u
  if /i "%%s"=="Uninstallstring" SET /a us+=1&SET ut=%%u
  if /i "%%s"=="quietUninstallstring" SET /a qu+=1
  if /i "%%s"=="publisher" SET pu=%%u
 )
 FOR %%s IN (dn us qu) DO SET /a %%s+=0
 CALL :report
)

GOTO :eof

:report
SET /a tus=us+qu
ECHO %dn%   %us%   %qu%   %tus%   %pu% %dn% %ut%
GOTO :eof

此程序应显示有趣的细节。

报告列是

  1. 找到'displayname'的数量
  2. 找到'Uninstallstring'的数量
  3. 找到'quiteuninstallstring'的数量
  4. 前两列的总数
  5. 发布商字符串 - 如果找到
  6. displayname - if found found
  7. 卸载文字 - 如果找到
  8. 我建议您使用此数据对您的数组进行过滤和分配 - 内部循环处理单个卸载项。选择所需的部件并将其添加或不添加到阵列中。