簡體   English   中英

如何使用批處理文件自動卸載其顯示名稱中包含“ VNC”的所有程序?

[英]How can I automatically uninstall all programs containing “VNC” in their displayname using a batch file?

我正在嘗試創建一個批處理腳本,該腳本將查詢注冊表以獲取卸載軟件包。 目標是創建一個批處理腳本,該腳本將卸載所有VNC程序(UltraVNC,RealVNC和TightVNC)。 這必須與Windows XP和Windows 7兼容。

我從該StackOverflow解決方案的Reg Query腳本中的腳本開始, 獲取了批處理腳本 我試圖更改代碼以允許它在DisplayName中搜索“ VNC”,在其對應的UninstallPath中的{}之間刪除文本,然后運行msiexec.exe /qn /x {package-identifier}進行靜默卸載該程序。

運行以下代碼時,它將檢索幾個在其DisplayName中不包含“ VNC”的程序。 問題似乎出在以下代碼行中:

if not "x!str1:VNC=!"=="x!str1!" (

此行代碼的源代碼: 如何檢查Windows批處理文件中的變量是否包含另一個變量?

我嘗試使用以下代碼作為替代,但是它也列出了太多的軟件包,並且沒有正確選擇名稱中只有“ VNC”的軟件包。

set str1 = !product[%counter%]!
echo str1 > temp.dat
findstr /c:"VNC" "temp.dat" >nul 2>&1
if %errorlevel% == 0 (

注意:許多echo命令僅用於測試目的。

 @echo off
    setlocal
    set regVar=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
    set excluded=/c:" Microsoft" /c:"MDOP" /c:"Dell" 
    set count=1
    for /f "tokens=1,2,*" %%a in ('Reg Query %regVar% /S ^| findstr "DisplayName HKEY_ UninstallString"') do (
        setlocal EnableDelayedExpansion
        for %%n in (!count!) do (
            ENDLOCAL
            SET HKEY=Y
            IF "%%a"=="DisplayName" SET "HKEY="&set product[%%n]=%%c
            IF "%%a"=="UninstallString" SET "HKEY="&IF NOT DEFINED uninstall[%%n] set uninstall[%%n]=%%c
            IF "%%a"=="QuietUninstallString" SET "HKEY="&IF NOT DEFINED uninstall[%%n] set uninstall[%%n]=%%c
        IF DEFINED hkey IF DEFINED product[%%n] IF defined uninstall[%%n] SET /a count+=1&SET "hkey="
        IF DEFINED hkey set "product[%%n]="&SET "uninstall[%%n]="
        )
    )

    IF NOT DEFINED product[%count%] SET "uninstall[%count%]="&SET /a count-=1
    IF NOT DEFINED uninstall[%count%] SET "product[%count%]="&SET /a count-=1
    ECHO %count% entries found
    set counter=%count%
    pause
    @setlocal enableextensions enabledelayedexpansion
    :while
    if %counter% GTR 0 (
        set str1 = !product[%counter%]!
        echo str1
        if not "x!str1:VNC=!"=="x!str1!" (
            echo !product[%counter%]!
            echo !uninstall[%counter%]!
            set UninstallString=!uninstall[%counter%]!
            echo !UninstallString!
            set RunUninstall = ""
            for /f "tokens=2 delims={}" %%A in ("!uninstall[%counter%]!") do echo %%A REM set RunUninstall="msiExec.exe /qn /x{%%A}" (commented for testing purposes)
            call !RunUninstall!
            set /a counter-=1
            GOTO While
            ) Else (
            set /a counter-=1
            GOTO While
            )
        )

輸出片段:

Intel(R) Network Connections 15.7.176.0
MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F86418051F0}
MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F86418051F0}
26A24AE4-039D-4CA4-87B4-2F86418051F0 REM set RunUninstall="msiExec.exe /qn /x{26
A24AE4-039D-4CA4-87B4-2F86418051F0}"
ECHO is off.
Microsoft .NET Framework 4.5.2
MsiExec.exe /X{26784146-6E05-3FF9-9335-786C7C0FB5BE}
MsiExec.exe /X{26784146-6E05-3FF9-9335-786C7C0FB5BE}
26784146-6E05-3FF9-9335-786C7C0FB5BE REM set RunUninstall="msiExec.exe /qn /x{26
784146-6E05-3FF9-9335-786C7C0FB5BE}"
ECHO is off.
Lenovo ThinkVantage Toolbox
MsiExec.exe /I{23170F69-40C1-2702-0920-000001000000}
MsiExec.exe /I{23170F69-40C1-2702-0920-000001000000}
23170F69-40C1-2702-0920-000001000000 REM set RunUninstall="msiExec.exe /qn /x{23
170F69-40C1-2702-0920-000001000000}"
ECHO is off.
OSFMount v1.5
MsiExec.exe /I{1B8ABA62-74F0-47ED-B18C-A43128E591B8}
MsiExec.exe /I{1B8ABA62-74F0-47ED-B18C-A43128E591B8}
1B8ABA62-74F0-47ED-B18C-A43128E591B8 REM set RunUninstall="msiExec.exe /qn /x{1B
8ABA62-74F0-47ED-B18C-A43128E591B8}"

更新:我修改了wOxxOm提供的代碼,以嘗試使TightVNC成為異常並安靜地將其卸載。 由於TightVNC的注冊表中沒有QuietUninstallString,因此我嘗試通過使用msiexec.exe /qn /x選項來完成此操作。 但是,它始終拋出以下錯誤:

else was unexpected at this time.

下面列出了我對wOxxOm代碼的修改后的版本:

@echo off
setlocal enableDelayedExpansion
for %%a in ("" "\Wow6432Node") do (
    for /f "delims=" %%b in ('
        reg query HKLM\SOFTWARE%%~a\Microsoft\Windows\CurrentVersion\Uninstall ^
            /s /d /f "VNC" ^| findstr "HKEY_ DisplayName"
    ') do (
        set "line=%%b"
        if "!line:~0,4!"=="HKEY" (
            set "key=!line!"
        ) else (
            set Uninstall=
            rem Sort /r makes QuietUninstallString the last line
            for /f "tokens=2*" %%c in ('
                reg query "!key!" ^| find "UninstallString" ^| sort /r
            ') do if not "%%d"=="" set "Uninstall=%%d"

            if defined Uninstall (

                for /f "tokens=2*" %%c in ("!line!") do (
                    set product=%%d
                    if "x!product:TightVNC=!"=="x!product!" (
                        for /f "tokens=2 delims={}" %%A in ("!Uninstall!") do (
                        echo Found !product!
                        Running msiExec.exe /qn /x{%%A} REM (COMMENTED FOR TESTING)
                        REM CALL msiExec.exe /qn /x{%%A}
                        )
                    ) else (
                    echo Found %%d
                    echo Running !Uninstall! (COMMENTED FOR TESTING)
                    rem call !Uninstall!
                    echo.
                    )
                )
           )
        )
    )
  1. 不要在set str1=!product[%counter%]!使用=周圍的空格set str1=!product[%counter%]!
  2. 而不是if %counter% GTR 0 (這不起作用並使循環無限)
    if %counter%==0 goto done並在循環后使用:done標簽
  3. 使用引號,您無需在比較中添加x
  4. 不要忘記64位Windows,並檢查Wow6432Node樹(請參閱替代代碼)

:while
if %counter%==0 goto done
set str1=!product[%counter%]!
if not "!str1:VNC=!"=="!str1!" (
    ..............................
    rem call !RunUninstall!
)
set /a counter-=1
GOTO While

:done

另外,您可以通過僅在DisplayName中僅列出具有VNC的產品,然后獲取UninstallString來使批處理文件更快(如果有很多字符串,“數組”會很慢):

@echo off
setlocal enableDelayedExpansion
for %%a in ("" "\Wow6432Node") do (
    for /f "delims=" %%b in ('
        reg query HKLM\SOFTWARE%%~a\Microsoft\Windows\CurrentVersion\Uninstall ^
            /s /d /f "VNC" ^| findstr "HKEY_ DisplayName"
    ') do (
        set "line=%%b"
        if "!line:~0,4!"=="HKEY" (
            set "key=!line!"
        ) else (
            set Uninstall=
            rem Sort /r makes QuietUninstallString the last line
            for /f "tokens=2*" %%c in ('
                reg query "!key!" ^| find "UninstallString" ^| sort /r
            ') do if not "%%d"=="" set "Uninstall=%%d"

            if defined Uninstall (
                for /f "tokens=2*" %%c in ("!line!") do echo Found %%d
                echo Running !Uninstall! (COMMENTED FOR TESTING)
                rem call !Uninstall!
                echo.
            )
        )
    )
)
pause

修改wOxxOm的代碼,我能夠創建以下代碼來靜默卸載TightVNC,UltraVNC和RealVNC。 它還將使用Windows注冊表HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\UninstallHKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall下的Windows注冊表中的DisplayName中的“ VNC”啟動任何其他軟件的HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall

希望這對其他人也很方便。

@echo off
setlocal enableDelayedExpansion
for %%a in ("" "\Wow6432Node") do (
    for /f "delims=" %%b in ('
        reg query HKLM\SOFTWARE%%~a\Microsoft\Windows\CurrentVersion\Uninstall ^
            /s /d /f "VNC" ^| findstr "HKEY_ DisplayName"
    ') do (
        set "line=%%b"
        if "!line:~0,4!"=="HKEY" (
            set "key=!line!"
        ) else (
            set Uninstall=
            rem Sort /r makes QuietUninstallString the last line
            for /f "tokens=2*" %%c in ('
                reg query "!key!" ^| find "UninstallString" ^| sort /r
            ') do if not "%%d"=="" set "Uninstall=%%d"

            if defined Uninstall (

                for /f "tokens=2*" %%c in ("!line!") do (
                    set product=%%d
                    if NOT "x!product:TightVNC=!"=="x!product!" (
                        for /f "tokens=2 delims={}" %%A in ("!Uninstall!") do (
                        echo Found !product!
                        CALL msiExec.exe /qn /x{%%A}
                        echo.
                        )
                    ) else (
                        if NOT "x!product:UltraVNC=!"=="x!product!" (
                            for /f "tokens=1 delims=." %%A in ("!Uninstall!") do (
                                echo Found !product!
                                CALL %%A.exe" /VERYSILENT /NORESTART
                                echo.
                            )
                            ) else (
                                if NOT "x!Uninstall:RealVNC=!"=="x!Uninstall!" (
                                            for /f "tokens=1 delims=." %%A in ("!Uninstall!") do (
                                            echo Found !product!
                                            CALL %%A.exe" /VERYSILENT
                                            echo.
                                        )
                                    ) else (
                                        echo Found %%d
                                        CALL !Uninstall!
                                        echo.
                                )
                            )
                        )
                    )
                )
           )
        )
    )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM