我正在尝试制作一个批处理脚本来卸载各种程序而几乎没有用户参与(只是说我要卸载A组(Say,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}
感谢。
:: UPDATE ::
我明白了。通过使用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吗?”)
答案 0 :(得分: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吗?”)