バッチスクリプトを作成して、ユーザーの関与をほとんど必要とせずにさまざまなプログラムをアンインストールしようとしています(グループA(たとえば、GoogleChromeとMicrosoftOffice)をアンインストールしたいというだけです)。これ自体は不可能ではありません。msiexecを呼び出してレジストリ内のアンインストール場所(msiexec / x {xxxxx-xxxxx-xxxxxx-xxxx})を指定することで、これを行うことができます。
これに関する唯一の問題は、更新でよくあるように、プログラムがレジストリキーを変更するたびに、パスを再度見つける必要があることを意味します。そのため、HKLM \ SOFTWARE \ Mincrosoft \ Windows \ CurrentVersion \ Uninstallレジストリの場所を検索するコードを実行しようとしています。また、DisplayNameが特定の値を返すたびに、必ずしも正確ではありません(「Chrome」と言ってください)。レジストリの場所を保存しますか?({xxxxxxx-xxxxxxx-xxxxxxx-xxxxxx}に配置される部分)。
このように、プログラムは単にプログラムを見つけてその場所を保存し、変数としてアンインストールできるようにします。私は試しましたが、私が知る限り、regクエリを使用するには完全な場所が必要です。reg query HKLM / fを使用すると、結果は返されません。さまざまな回避策を試しましたが、何も機能しないようです。
これが私のコードの基本バージョンです(その多くが繰り返されているため、フルバージョンを投稿することを怠っています。ほとんどの場合、whereとif thenステートメントの場合です)
@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
これにより、プログラム名と一意の識別子が出力され、ユーザー入力なしでプログラムがアンインストールされます(「xをアンインストールしますか?」)