Câu trả lời:
Mỗi chương trình tự cài đặt đúng theo hướng dẫn của Microsoft sẽ tạo một mục đăng ký HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
. Thông thường, chìa khóa cho chương trình sẽ là GUID của nó, hoặc tên khác của chương trình. Trong khóa đó sẽ là một mục được gọi UninstallString
. Điều này chứa lệnh để thực thi để gỡ cài đặt chương trình.
Nếu bạn đã biết trước những gì bạn sẽ gỡ cài đặt, nó sẽ đủ dễ dàng để chỉ cần đặt nó trong tệp bó của bạn. Nó trở nên khó khăn khi bạn cố gắng tự động hóa quá trình đó. Bạn có thể sử dụng reg
lệnh để lấy dữ liệu từ sổ đăng ký, nhưng nó trả về rất nhiều văn bản xung quanh giá trị thực của một khóa đã cho, khiến nó khó sử dụng. Bạn có thể muốn thử nghiệm sử dụng VBscript hoặc PowerShell, vì họ có các tùy chọn tốt hơn để nhận dữ liệu từ sổ đăng ký thành một biến.
Bạn có thể gọi trình gỡ cài đặt chính xác mà không cần biết GUID, v.v. bằng cách sử dụng WMIC.
Để xem danh sách tên của các chương trình mà Windows đã biết trong nội bộ:
wmic product get name
Hãy tìm tên sản phẩm của bạn. Nó có thể phù hợp với bảng liệt kê trong bảng điều khiển "Chương trình và Tính năng" , nhưng không phải lúc nào cũng vậy.
Sau đó, bạn có thể sử dụng
wmic product where name="_my_product_name" call uninstall
để thực hiện gỡ cài đặt, AFAIK nên im lặng (đó là kinh nghiệm của tôi, nhưng hãy thử trước khi bạn đặt cược vào trang trại. Sự im lặng có thể phụ thuộc vào cách trình cài đặt / trình gỡ cài đặt của bạn được xây dựng).
Xem tại đây để biết thêm:
Ngoài ra còn có tài liệu tham khảo cho WMIC trên microsoft.com.
Nếu bạn đã cài đặt PowerShell 3 (hoặc cao hơn), bạn có thể thực hiện cuộc gọi WMI để nhận tất cả các chương trình được đặt tên một thứ nhất định (hoặc 'giống như' một thứ nhất định, để thực hiện tìm kiếm ký tự đại diện), sau đó gọi Uninstall
phương thức cho từng trong số chúng:
(Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name like '%Partial Name%'").uninstall()
Nếu một chương trình sử dụng Windows Installer, bạn có thể sử dụng một trong các lệnh sau:
msiexec /q /x <ProductCodeGuid>
msiexec /q /x <PathToMsi>
Tuy nhiên, bạn có thể không có mã sản phẩm cũng như tệp MSI gốc được sử dụng để cài đặt.
Ngoài ra, không có lệnh gỡ cài đặt chung, vì các trình cài đặt không sử dụng Windows Installer là "không xác định" bởi hệ điều hành. Họ có thể cung cấp gỡ cài đặt riêng của họ, nhưng liệu thực thi đó có bao gồm cách chạy nó mà không cần GUI hay không phụ thuộc vào gói phần mềm riêng lẻ.
Một tập lệnh VBScript sẽ giúp bạn gỡ cài đặt chương trình yêu cầu.
Để sử dụng tập lệnh này, bạn sẽ yêu cầu tên phần mềm được đặt trong sổ đăng ký của bạn.
Chỉ cần nhập tên ứng dụng trong tập lệnh và chạy nó với quyền quản trị viên; nó sẽ gỡ cài đặt ứng dụng. Nhưng điều này sẽ chỉ hoạt động cho một ứng dụng dựa trên cửa sổ; đối với thiết lập độc lập hoặc ứng dụng không tạo mục trong chuỗi cài đặt đăng ký, tập lệnh sẽ không hoạt động.
Vì vậy, trong trường hợp đó, bạn sẽ phải tìm một cách khác để gỡ cài đặt ứng dụng.
Mã số:
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
Hãy kiểm tra xem, cái này đang sử dụng một đợt tìm khóa đăng ký UninstallString của phần mềm và sau đó gỡ cài đặt phần mềm một cách im lặng, đáng tin cậy hơn nhiều so với wmic tôi tìm thấy. https://community.spiceworks.com/topic/2143980-deploy-or-upTHER-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
/node:"<ComputerName>"
ex :wmic /node:"someuser-pc" product get name
. Hãy chắc chắn rằng bạn sử dụng "" xung quanh tên nếu không bạn sẽ gặp phải lỗi "Chuyển đổi toàn cầu không hợp lệ". Ngoài ra, hãy chắc chắn rằng bạn chạy nó từ dấu nhắc CMD chứ không phải lời nhắc PowerShell vì cách khắc phục "" cho lỗi "Chuyển đổi toàn cầu không hợp lệ" không hoạt động trong lời nhắc PowerShell.