我試圖製作一個批處理腳本來卸載各種程序,用戶幾乎沒有參與(只說我想卸載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
這將輸出的程序名稱和唯一標識,然後卸載程序,無需用戶輸入