ถอนการติดตั้งโปรแกรมอย่างเงียบ ๆ ผ่านทาง CMD


30

มีวิธีที่ฉันสามารถถอนการติดตั้งโปรแกรมโดยไม่ใช้ส่วนต่อประสานกราฟิกและทำผ่าน CMD ได้หรือไม่?

คำตอบ:


19

โปรแกรมที่ต้องติดตั้งตัวเองเป็นไปตามหลักเกณฑ์ของ Microsoft HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstallทุกคนที่ทำให้รายการรีจิสทรีใน โดยปกติแล้วคีย์สำหรับโปรแกรมจะเป็น GUID หรือชื่ออื่นของโปรแกรม UninstallStringภายในที่สำคัญที่จะได้รับรายการที่เรียกว่า สิ่งนี้มีคำสั่งเพื่อดำเนินการถอนการติดตั้งโปรแกรม

หากคุณทราบล่วงหน้าว่าจะถอนการติดตั้งสิ่งใดสิ่งที่ควรทำก็ง่ายพอที่จะใส่ไว้ในไฟล์แบทช์ของคุณ มันค่อนข้างยุ่งยากเมื่อคุณพยายามทำให้กระบวนการนั้นเป็นแบบอัตโนมัติ คุณสามารถใช้regคำสั่งเพื่อรับข้อมูลจากรีจิสทรี แต่จะส่งกลับข้อความจำนวนมากรอบค่าที่แท้จริงของคีย์ที่กำหนดทำให้ยากต่อการใช้งาน คุณอาจต้องการทดสอบโดยใช้ VBscript หรือ PowerShell เนื่องจากมีตัวเลือกที่ดีกว่าสำหรับการรับข้อมูลจากรีจิสทรีไปยังตัวแปร


26

คุณสามารถเรียกใช้ตัวถอนการติดตั้งที่ถูกต้องได้โดยไม่ต้องรู้จัก GUID ฯลฯ โดยใช้ WMIC

ในการดูรายการชื่อโปรแกรมที่ทราบภายในโดย Windows:

wmic product get name

ค้นหาชื่อผลิตภัณฑ์ของคุณ อาจตรงกับที่แสดงไว้ในแผงควบคุม"โปรแกรมและคุณลักษณะ"แต่ไม่เสมอไป

จากนั้นคุณสามารถใช้

wmic product where name="_my_product_name" call uninstall

เพื่อทำการถอนการติดตั้งซึ่ง AFAIK ควรจะเงียบ (เป็นประสบการณ์ของฉัน แต่ลองก่อนที่คุณจะเดิมพันฟาร์มในเรื่องนั้นความเงียบอาจขึ้นอยู่กับวิธีการสร้างตัวติดตั้ง / ถอนการติดตั้งของคุณ)

ดูที่นี่สำหรับข้อมูลเพิ่มเติม:

นอกจากนี้ยังมีเอกสารอ้างอิงสำหรับ WMIC ใน microsoft.com


2
คุณสามารถเรียกใช้นี้กับคอมพิวเตอร์ระยะไกลโดยการเพิ่มเช่น:/node:"<ComputerName>" wmic /node:"someuser-pc" product get nameตรวจสอบให้แน่ใจว่าคุณใช้ "" ล้อมรอบชื่อไม่เช่นนั้นคุณจะพบข้อผิดพลาด "สวิตช์ไม่ถูกต้องทั่วโลก" นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณเรียกใช้สิ่งนี้จากพรอมต์ CMD และไม่ใช่พรอมต์ PowerShell เนื่องจากข้อผิดพลาด "" สำหรับสวิตช์สากลไม่ถูกต้อง "ไม่ทำงานในพรอมต์ PowerShell
Chris Magnuson

1
คำตอบที่ดี แต่คำเตือนเล็กน้อยคือ WMIC สามารถใช้เวลาพอสมควรในการดำเนินการคำสั่ง รายการสินค้าใช้เวลาประมาณ 3 นาทีบนพีซีของฉัน
SmacL

ตั้งข้อสังเกตอย่างถูกต้อง @SmacL ฉันมีโอกาสที่จะใช้สิ่งนี้เพียงไม่กี่ครั้งและขึ้นอยู่กับสิ่งที่อยู่ในระบบของคุณฉันเชื่อว่าอาจใช้เวลาสักครู่
Carnot Antonio Romero

7

หากคุณติดตั้ง PowerShell 3 (หรือสูงกว่า) คุณสามารถออกการเรียก WMI เพื่อรับโปรแกรมทั้งหมดที่ตั้งชื่อสิ่งหนึ่ง (หรือ 'ชอบ' บางสิ่งเพื่อทำการค้นหาตัวแทน) จากนั้นเรียกUninstallวิธีการสำหรับแต่ละรายการ:

(Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name like '%Partial Name%'").uninstall()


5

หากคุณทราบว่าไฟล์ติดตั้ง MSI อยู่ที่ไหนคุณสามารถใช้:

Msiexec / ถอนการติดตั้ง Application.msi / เงียบ


5

หากโปรแกรมใช้ Windows Installer คุณสามารถใช้หนึ่งในคำสั่งต่อไปนี้:

msiexec /q /x <ProductCodeGuid>
msiexec /q /x <PathToMsi>

อย่างไรก็ตามคุณอาจไม่มีรหัสผลิตภัณฑ์หรือไฟล์ MSI ดั้งเดิมที่ใช้สำหรับการติดตั้ง

นอกจากนั้นไม่มีคำสั่งถอนการติดตั้งทั่วไปเนื่องจากตัวติดตั้งที่ไม่ได้ใช้ Windows Installer นั้นเป็นระบบปฏิบัติการที่ "ไม่รู้จัก" พวกเขาอาจจัดหาการถอนการติดตั้งของตัวเองปฏิบัติการ แต่ไม่ว่าปฏิบัติการที่มีวิธีการเรียกใช้โดยไม่ต้อง GUI ขึ้นอยู่กับแพคเกจซอฟต์แวร์ของแต่ละบุคคล


1

สคริปต์ VBScript จะช่วยให้คุณถอนการติดตั้งโปรแกรมที่ต้องการ

ในการใช้สคริปต์นี้คุณจะต้องใช้ชื่อซอฟต์แวร์ที่อยู่ในรีจิสทรีของคุณ

เพียงป้อนชื่อแอปพลิเคชันในสคริปต์และเรียกใช้ด้วยสิทธิ์ผู้ดูแลระบบ มันจะถอนการติดตั้งแอปพลิเคชัน แต่วิธีนี้จะใช้ได้เฉพาะกับแอปพลิเคชันที่ใช้หน้าต่างเท่านั้น สำหรับการตั้งค่าแบบสแตนด์อโลนหรือแอปที่ไม่ได้ทำรายการในสตริงการถอนการติดตั้งของรีจิสทรีสคริปต์จะไม่ทำงาน

ดังนั้นในกรณีนี้คุณจะต้องหาวิธีถอนการติดตั้งแอปพลิเคชั่นอื่น

รหัส:

On error resume Next

Dim strName, WshShell, oReg, keyname

Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."

'=============================================
'Change the value here with DisplayName's value
strName = " "
'=============================================
Set WshShell = CreateObject("WScript.Shell")
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys
For Each subkey In arrSubKeys
    keyname = ""
       keyname = wshshell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & subkey & "\DisplayName")
    If keyname = strName then
        i = subkey
    End If
Next

If i Then

    WshShell.Run "MSIEXEC.EXE /X " & i & " /QN", 1, True
End If

Set WshShell = Nothing
set ObjReg = Nothing

WScript.Quit

1

ลองใช้งานดูสินี่เป็นการใช้แบทช์ค้นหา UninstallString รีจิสตรีคีย์ของซอฟต์แวร์จากนั้นถอนการติดตั้งซอฟท์แวร์แบบเงียบ ๆ ซึ่งมีความน่าเชื่อถือมากกว่าเมื่อเปรียบเทียบกับ wmic ที่ฉันพบ https://community.spiceworks.com/topic/2143980-deploy-or-upgrade-java-8-via-shutdown-script-remove-old-javas

::It extracts software software GUID, then use the GUID to search the name and version
@echo off
setlocal ENABLEDELAYEDEXPANSION

set SoftwareName=Java 8
set NewVersion=8.0.1720.11
set x86GUID=HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
set x64GUID=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
set Installer=\\dc\sources\jre-8u172-windows-i586.exe REMOVEOUTOFDATEJRES=1 AUTO_UPDATE=0 EULA=0 NOSTARTMENU=1 SPONSORS=0 WEB_ANALYTICS=0 WEB_JAVA=1 WEB_JAVA_SECURITY_LEVEL=H /s
REM set Installer=d:\downloads\jre-8u172-windows-i586.exe REMOVEOUTOFDATEJRES=1 AUTO_UPDATE=0 EULA=0 NOSTARTMENU=1 SPONSORS=0 WEB_ANALYTICS=0 WEB_JAVA=1 WEB_JAVA_SECURITY_LEVEL=H /s

REM It's faster to first locate the software GUID, then search it's Name, Version & UninstallString
for /f "delims=" %%P in ('reg query "%x86GUID%" /s /f "%SoftwareName%" 2^>nul ^| findstr "HKEY_LOCAL_MACHINE"') do (
  echo %%P
  reg query "%%P" /v "DisplayVersion" 2>nul | findstr /r /c:"  %NewVersion%" >nul && (
    for /f "tokens=2*" %%A in ('reg query "%%P" /v "DisplayName" 2^>nul ^|findstr "DisplayName"') do echo %%B has already been installed
    for /f "tokens=2*" %%A in ('reg query "%%P" /v "DisplayVersion" 2^>nul ^|findstr "DisplayVersion"') do echo Version: %%B
    goto :EOF
  ) || (
    for /f "tokens=2*" %%A in ('reg query "%%P" /v "DisplayName" 2^>nul ^|findstr "DisplayName"') do echo Found other version %%B, upgrade in progress
    for /f "tokens=2*" %%A in ('reg query "%%P" /v "UninstallString" 2^>nul ^|findstr "UninstallString"') do (
      echo %%B | findstr /c:"MsiExec.exe"  >nul && (
        set MsiStr=%%B
        set MsiStr=!MsiStr:/I=/X!
        echo !MsiStr! /quiet /norestart
        !MsiStr! /quiet /norestart
        rem %Installer%
      ) || (
        echo None MsiExec Uninstall String %%B
        rem "%%B" /S
      )
    )
  )
)
if not defined MsiStr (
  echo %SoftwareName% not found, install it?
  rem %Installer%
)

endlocal

0

คำตอบที่ถูกต้องอยู่ด้านบน แต่สำหรับการติดตั้ง Windows X64 คุณจะต้องตรวจสอบ:

HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.