2015-11-20 42 views
-2

我正在尝试编写一个批处理脚本,它将搜索注册表并将UninstallString的值添加到一个变量中。
有几个注意事项:
1.键可以是在不同的工作站不同(取决于所使用的安装程序,存在samesoftware版本的多个修改版本MSI)
2.没有与已安装的补丁的主要产物
3该补丁必须先卸载主产品之前批处理文件:搜索注册表并设置多个变量

例如,思科监事桌面软件可能包含以下键值:

补丁3
KEY: HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微软\的Windows \ CurrentVersion \卸载{981E3887-9D55-4B91-B643-7155AA98C906}
显示名称值:思科桌面服务8.5(4)维护版本4类技术6
UninstallString值: MSIEXEC.EXE/X {981E3887-9D55-4B91-B643-7155AA98C906}

补丁2
KEY: HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微软\的Windows \ CurrentVersion \卸载{4FA5AFA8 -FDEB-43C9- 83B7-43092593ACDF}
DisplayName值:思科桌面服务8.5(4)维护版本4工程特别4
UninstallString值: MSIEXEC.EXE/X {4FA5AFA8-FDEB-43C9-83B7-43092593ACDF}

补丁1:
KEY: HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微软\的Windows \ CurrentVersion \卸载{CA941834-837E-44C2-BF83-E7E7558FDD61}
显示名称值:思科桌面服务8.5(4)维护版本4
UninstallString值: MSIEXEC.EXE/X {CA941834-837E-44C2-BF83-E7E7558FDD61}

主要产品:
KEY: HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微软\的Windows \ CurrentVersion \卸载
显示名称值:思科监事桌面
UninstallString值: MSIEXEC.EXE/X {AB60EBDC-45A9- 4764-96CB-EFCE4AD0C10B}

他们必须按照这个顺序被卸载。当安装多个版本时,还有可能在注册表中存在其他密钥。

我想搜索功能可以使用DisplayName值思科桌面服务,因为它是为所有的补丁然后为思科主管代理单独的搜索通用补丁创建。

我现在有WMIC命令,但有时他们可以运行,而如果我手动运行UninstallString值很快完成极其缓慢。我还有一些情况,即在UninstallString值会出现WMIC命令不会卸载产品的情况。如果这是可能

任何帮助,将不胜感激。

+1

'reg'效用为基础的方法是最快的的确,看看[我怎么能自动卸载使用批处理文件,其中包含“VNC”在他们的显示名称的所有程序?(http://stackoverflow.com/a/33279973)如果你可以调整它,它自己, – wOxxOm

+0

谢谢您。这似乎很适合查找卸载字符串。你知道一种安排卸载的方法,以便它们以特定顺序卸载吗? –

+0

我想可能有很多种方法。例如,你可以使一个“阵列”与所有的卸载字符串 – wOxxOm

回答

0

@wOxxOm
(这是一条很长的评论,不是答案。)谢谢您的建议。不幸的是,我以前从来没有深入批量编码。但是我已经把你的代码修改了,并且能够将DisplayNameUninstallString列表导出到文本文件中。我也能够正确地排列DisplayName列表,但我无法获得相应的UninstallString以相同的顺序排序。例如,未排序DisplayName列表被列为2,3,1我可以得到它分类为3,2,1使用sort /r。但是,如果我用sort /r排序UninstallString名单,我得到的1排序列表,3,2

app.txt  
2 Cisco Desktop Services 8.5(4) Maintenance Release 4 Engineering Special 4 
3 Cisco Desktop Services 8.5(4) Maintenance Release 4 Engineering Special 6 
1 Cisco Desktop Services 8.5(4) Maintenance Release 4 

app_sorted.txt 
3 Cisco Desktop Services 8.5(4) Maintenance Release 4 Engineering Special 6 
2 Cisco Desktop Services 8.5(4) Maintenance Release 4 Engineering Special 4 
1 Cisco Desktop Services 8.5(4) Maintenance Release 4 

un.txt  
2 MsiExec.exe /X{4FA5AFA8-FDEB-43C9-83B7-43092593ACDF} 
3 MsiExec.exe /X{981E3887-9D55-4B91-B643-7155AA98C906} 
1 MsiExec.exe /X{CA941834-837E-44C2-BF83-E7E7558FDD61} 

un_sorted.txt  
1 MsiExec.exe /X{CA941834-837E-44C2-BF83-E7E7558FDD61} 
3 MsiExec.exe /X{981E3887-9D55-4B91-B643-7155AA98C906} 
2 MsiExec.exe /X{4FA5AFA8-FDEB-43C9-83B7-43092593ACDF} 

The un_sorted.txt needs to be:  
3 MsiExec.exe /X{981E3887-9D55-4B91-B643-7155AA98C906} 
2 MsiExec.exe /X{4FA5AFA8-FDEB-43C9-83B7-43092593ACDF} 
1 MsiExec.exe /X{CA941834-837E-44C2-BF83-E7E7558FDD61} 

在每行开头的#'s是原来安装的顺序,因为它们必须在卸载相反的顺序。 #是供参考的。

我想能如果可能做到这一点没有txt文件。

感谢

下面是修改代码:

@echo off 
setlocal enableDelayedExpansion 
::Build array 
for %%a in ("" "\Wow6432Node") do (
    for /f "delims=" %%b in (' 
     reg query HKLM\SOFTWARE%%~a\Microsoft\Windows\CurrentVersion\Uninstall^
      /s /d /f "Cisco Desktop" ^| findstr "HKEY_ DisplayName" ^| sort /r 
    ') do (
     set "line=%%b" 
     if "!line:~0,4!"=="HKEY" (
      set "key=!line!" 
     ) else (
      set Uninstall= 
      rem Sort /r makes QuietUninstallString the last line 
      for /f "tokens=2*" %%c in (' 
       reg query "!key!" ^| find "UninstallString" ^| sort /r 
      ') do if not "%%d"=="" set "Uninstall=%%d" 

      if defined Uninstall (
       for /f "tokens=2*" %%c in ("!line!") do (
       set app=%%d 
       echo !app! >> C:\Test\app1.txt 
       echo !app!,!Uninstall! >> C:\Test\un1.txt 
       ) 
      ) 
     ) 
    ) 
) 
sort /r <C:\Test\app.txt> C:\Test\app_sorted.txt 

编辑: 如果我做^| sort /rDisplayName行查找,我会得到DisplayName结果我正在寻找,但它重复相同UninstallStringDisplayName列出:

un.txt 
3 Cisco Desktop Services 8.5(4) Maintenance Release 4 Engineering Special 6,MsiExec.exe /X{4FA5AFA8-FDEB-43C9-83B7-43092593ACDF}  
2 Cisco Desktop Services 8.5(4) Maintenance Release 4 Engineering Special 4,MsiExec.exe /X{4FA5AFA8-FDEB-43C9-83B7-43092593ACDF}  
1 Cisco Desktop Services 8.5(4) Maintenance Release 4,MsiExec.exe /X{4FA5AFA8-FDEB-43C9-83B7-43092593ACDF} 
+0

我知道我可以直接在脚本中添加的显示名称为列表,并且将工作的伟大,但它不会帮助那些已经安装了旧版本的工作站而且如果不查看它,我可能不知道该列表。然后我必须修改不同列表的脚本。不是我想要做的。 –

相关问题