มีวิธีที่ฉันสามารถถอนการติดตั้งโปรแกรมโดยไม่ใช้ส่วนต่อประสานกราฟิกและทำผ่าน CMD ได้หรือไม่?
มีวิธีที่ฉันสามารถถอนการติดตั้งโปรแกรมโดยไม่ใช้ส่วนต่อประสานกราฟิกและทำผ่าน CMD ได้หรือไม่?
คำตอบ:
โปรแกรมที่ต้องติดตั้งตัวเองเป็นไปตามหลักเกณฑ์ของ Microsoft HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
ทุกคนที่ทำให้รายการรีจิสทรีใน โดยปกติแล้วคีย์สำหรับโปรแกรมจะเป็น GUID หรือชื่ออื่นของโปรแกรม UninstallString
ภายในที่สำคัญที่จะได้รับรายการที่เรียกว่า สิ่งนี้มีคำสั่งเพื่อดำเนินการถอนการติดตั้งโปรแกรม
หากคุณทราบล่วงหน้าว่าจะถอนการติดตั้งสิ่งใดสิ่งที่ควรทำก็ง่ายพอที่จะใส่ไว้ในไฟล์แบทช์ของคุณ มันค่อนข้างยุ่งยากเมื่อคุณพยายามทำให้กระบวนการนั้นเป็นแบบอัตโนมัติ คุณสามารถใช้reg
คำสั่งเพื่อรับข้อมูลจากรีจิสทรี แต่จะส่งกลับข้อความจำนวนมากรอบค่าที่แท้จริงของคีย์ที่กำหนดทำให้ยากต่อการใช้งาน คุณอาจต้องการทดสอบโดยใช้ VBscript หรือ PowerShell เนื่องจากมีตัวเลือกที่ดีกว่าสำหรับการรับข้อมูลจากรีจิสทรีไปยังตัวแปร
คุณสามารถเรียกใช้ตัวถอนการติดตั้งที่ถูกต้องได้โดยไม่ต้องรู้จัก GUID ฯลฯ โดยใช้ WMIC
ในการดูรายการชื่อโปรแกรมที่ทราบภายในโดย Windows:
wmic product get name
ค้นหาชื่อผลิตภัณฑ์ของคุณ อาจตรงกับที่แสดงไว้ในแผงควบคุม"โปรแกรมและคุณลักษณะ"แต่ไม่เสมอไป
จากนั้นคุณสามารถใช้
wmic product where name="_my_product_name" call uninstall
เพื่อทำการถอนการติดตั้งซึ่ง AFAIK ควรจะเงียบ (เป็นประสบการณ์ของฉัน แต่ลองก่อนที่คุณจะเดิมพันฟาร์มในเรื่องนั้นความเงียบอาจขึ้นอยู่กับวิธีการสร้างตัวติดตั้ง / ถอนการติดตั้งของคุณ)
ดูที่นี่สำหรับข้อมูลเพิ่มเติม:
นอกจากนี้ยังมีเอกสารอ้างอิงสำหรับ WMIC ใน microsoft.com
หากคุณติดตั้ง PowerShell 3 (หรือสูงกว่า) คุณสามารถออกการเรียก WMI เพื่อรับโปรแกรมทั้งหมดที่ตั้งชื่อสิ่งหนึ่ง (หรือ 'ชอบ' บางสิ่งเพื่อทำการค้นหาตัวแทน) จากนั้นเรียกUninstall
วิธีการสำหรับแต่ละรายการ:
(Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name like '%Partial Name%'").uninstall()
หากคุณทราบว่าไฟล์ติดตั้ง MSI อยู่ที่ไหนคุณสามารถใช้:
Msiexec / ถอนการติดตั้ง Application.msi / เงียบ
หากโปรแกรมใช้ Windows Installer คุณสามารถใช้หนึ่งในคำสั่งต่อไปนี้:
msiexec /q /x <ProductCodeGuid>
msiexec /q /x <PathToMsi>
อย่างไรก็ตามคุณอาจไม่มีรหัสผลิตภัณฑ์หรือไฟล์ MSI ดั้งเดิมที่ใช้สำหรับการติดตั้ง
นอกจากนั้นไม่มีคำสั่งถอนการติดตั้งทั่วไปเนื่องจากตัวติดตั้งที่ไม่ได้ใช้ Windows Installer นั้นเป็นระบบปฏิบัติการที่ "ไม่รู้จัก" พวกเขาอาจจัดหาการถอนการติดตั้งของตัวเองปฏิบัติการ แต่ไม่ว่าปฏิบัติการที่มีวิธีการเรียกใช้โดยไม่ต้อง GUI ขึ้นอยู่กับแพคเกจซอฟต์แวร์ของแต่ละบุคคล
สคริปต์ 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
ลองใช้งานดูสินี่เป็นการใช้แบทช์ค้นหา 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
คำตอบที่ถูกต้องอยู่ด้านบน แต่สำหรับการติดตั้ง Windows X64 คุณจะต้องตรวจสอบ:
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
/node:"<ComputerName>"
wmic /node:"someuser-pc" product get name
ตรวจสอบให้แน่ใจว่าคุณใช้ "" ล้อมรอบชื่อไม่เช่นนั้นคุณจะพบข้อผิดพลาด "สวิตช์ไม่ถูกต้องทั่วโลก" นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณเรียกใช้สิ่งนี้จากพรอมต์ CMD และไม่ใช่พรอมต์ PowerShell เนื่องจากข้อผิดพลาด "" สำหรับสวิตช์สากลไม่ถูกต้อง "ไม่ทำงานในพรอมต์ PowerShell