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 query HKLM /f 不返回任何结果。我尝试了一系列不同的解决方法,但似乎没有任何效果。

这是我的代码的基本版本(我忽略了发布完整版本,因为其中大部分是重复的。主要是 case where's 和 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 吗?”)

4

1 回答 1

1

我想到了。通过使用 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 吗?”)

于 2012-11-01T05:19:45.810 回答