2015-11-20 67 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

我知道我可以直接在腳本中添加的顯示名稱爲列表,並且將工作的偉大,但它不會幫助那些已經安裝了舊版本的工作站而且如果不查看它,我可能不知道該列表。然後我必須修改不同列表的腳本。不是我想要做的。 –

相關問題