2012-10-31 89 views
3

我試圖製作一個批處理腳本來卸載各種程序,用戶幾乎沒有參與(只說我想卸載A組(說,Google Chrome和Microsoft Office)),部分爲工作和部分爲樂趣和實踐。這本身並不是不可能的,我可以通過調用msiexec並將它指向註冊表中的卸載位置(msiexec/x {xxxxx-xxxxx-xxxxxx-xxxx})來完成此操作。查找註冊表項值的問題

唯一的問題是,這意味着只要程序更改了註冊表項,就像更新時經常發生的那樣,我必須再次找到路徑。因此,我試圖運行一段代碼,它將通過HKLM \ SOFTWARE \ Mincrosoft \ Windows \ CurrentVersion \ Uninstall註冊表位置進行搜索,並且只要DisplayName返回某個值(不一定確切)(說「Chrome」),它存儲註冊表位置?(將放入{xxxxxxx-xxxxxxx-xxxxxxx-xxxxxx}的部分)。

這樣,程序只需找到程序並存儲它們的位置,以便可以將它們作爲變量進行卸載。我試過了,但據我所知使用reg查詢需要完整的位置。使用reg查詢HKLM/f不會返回結果。我嘗試了一系列不同的解決方法,但似乎沒有任何工作。

這裏是我的代碼基本版本(我忽略了,因爲大部分是重複發佈的完整版本。這是大多隻是情況是,如果再語句)

@echo off 
:start 
echo Hello 
echo. 
1: Uninstall Chrome 

set /p choice="Enter Choice: " 
if "%choice%"=="1" goto uninstall_chrome 

:uninstall_chrome 
reg query HKLM /f Chrome /t REG_SZ 
::msiexec /x{uninstall location for the program} 

感謝。

::更新::

我想通了。通過使用一些Rob van der Woude的代碼,我現在可以做到這一點。這樣做的代碼是:

CALL :Uninstall "Program Name" 

:Uninstall 
SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /F "tokens=* %%A IN ('REG QUERY HKLM\SOFWARE\Microsoft\Windows\CurrentVersion\Uninstall /F "%~1" /D /S 2^>NUL ^| FINDSTR /R /B /C:"HKEY_"') DO (
REG QUERY "%%~A" /F DisplayName /V /E | FINDSTR /R /I /C:" DisplayName .* .*%~1" >NUL 2>&1 
FOR /F "tokens=2*" %%B IN ('REG QUERY "%%~A" /F DisplayName /V /E 2^>NUL ^| FIND /I " DisplayName "') DO ECHO Program Name = %%C 
FOR /F "tokens=7 delims=\" %%B IN ("%%~A") DO ECHO Unique Identifier = %%B 
FOR /F "tokens=2*" %%B IN ('REG QUERY "%%~A" /F UninstallString /V /E ^| FIND /I " UninstallString "') DO %%C /qb 
) 
ENDLOCAL 

這將輸出的程序名稱和唯一標識,然後卸載程序,無需用戶輸入

回答

1

我想它(「你想卸載X?」)出。通過使用一些Rob van der Woude的代碼,我現在可以做到這一點。這樣做的代碼是:

CALL :Uninstall "Program Name" 

:Uninstall 
SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /F "tokens=* %%A IN ('REG QUERY HKLM\SOFWARE\Microsoft\Windows\CurrentVersion\Uninstall /F "%~1" /D /S 2^>NUL ^| FINDSTR /R /B /C:"HKEY_"') DO (
REG QUERY "%%~A" /F DisplayName /V /E | FINDSTR /R /I /C:" DisplayName .* .*%~1" >NUL 2>&1 
FOR /F "tokens=2*" %%B IN ('REG QUERY "%%~A" /F DisplayName /V /E 2^>NUL ^| FIND /I " DisplayName "') DO ECHO Program Name = %%C 
FOR /F "tokens=7 delims=\" %%B IN ("%%~A") DO ECHO Unique Identifier = %%B 
FOR /F "tokens=2*" %%B IN ('REG QUERY "%%~A" /F UninstallString /V /E ^| FIND /I " UninstallString "') DO %%C /qb 
) 
ENDLOCAL 

這將輸出的程序名和唯一的標識符,然後卸載程序,無需用戶輸入

(「你想卸載X?」)