Menghapus instalasi program secara diam-diam melalui CMD

30

Apakah ada cara saya dapat menghapus program tanpa antarmuka grafis dan melakukannya melalui CMD?

kb67
sumber

Jawaban:

19

Setiap program yang menginstal dengan benar sesuai dengan pedoman Microsoft membuat entri registri HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall. Biasanya, kunci untuk program adalah GUID-nya, atau nama program. Di dalam kunci itu akan ada entri yang disebut UninstallString. Ini berisi perintah untuk menjalankan untuk menghapus instalasi program.

Jika sebelumnya Anda sudah tahu apa yang akan dihapus instalasinya, cukup mudah untuk memasukkannya ke file batch Anda. Akan menjadi rumit ketika Anda mencoba untuk mengotomatiskan proses itu. Anda dapat menggunakan regperintah untuk mendapatkan data dari registri, tetapi mengembalikan banyak teks di sekitar nilai aktual dari kunci yang diberikan, sehingga sulit untuk digunakan. Anda mungkin ingin bereksperimen dengan menggunakan VBscript atau PowerShell, karena mereka memiliki opsi yang lebih baik untuk memasukkan data dari registri ke dalam variabel.

nhinkle
sumber
26

Anda dapat meminta uninstaller yang benar tanpa mengetahui GUID, dll. Dengan menggunakan WMIC.

Untuk melihat daftar nama-nama program yang dikenal secara internal oleh Windows:

wmic product get name

Cari nama produk Anda. Mungkin cocok dengan yang tercantum di panel kontrol "Program dan Fitur" , tetapi tidak selalu.

Maka Anda bisa menggunakannya

wmic product where name="_my_product_name" call uninstall

untuk melakukan uninstall, yang AFAIK harusnya diam (sudah ada dalam pengalaman saya, tetapi coba sebelum Anda bertaruh pada farm itu. Diam mungkin tergantung pada bagaimana installer / uninstaller Anda dibangun).

Lihat di sini untuk lebih lanjut:

Ada juga dokumentasi referensi untuk WMIC di microsoft.com.

Carnot Antonio Romero
sumber
2
Anda dapat menjalankan ini terhadap komputer remote dengan menambahkan /node:"<ComputerName>"ex: wmic /node:"someuser-pc" product get name. Pastikan bahwa Anda menggunakan "" di sekitar nama atau Anda akan mengalami kesalahan "Tidak Global Switch". Juga pastikan Anda menjalankan ini dari prompt CMD dan bukan prompt PowerShell karena solusi "" untuk kesalahan "Invalid Global Switch" tidak berfungsi dalam prompt PowerShell.
Chris Magnuson
1
Jawaban yang bagus, tetapi peringatan kecil adalah bahwa WMIC dapat mengambil cukup banyak waktu untuk menjalankan suatu perintah. Daftar produk memakan waktu sekitar 3 menit di PC saya.
SmacL
Tercatat, @SmacL. Saya hanya memiliki kesempatan untuk menggunakan ini beberapa kali, dan tergantung pada apa yang ada di sistem Anda, saya percaya itu akan memakan waktu.
Carnot Antonio Romero
7

Jika Anda memasang PowerShell 3 (atau lebih tinggi), Anda dapat mengeluarkan panggilan WMI untuk membuat semua program menamakan sesuatu (atau 'menyukai' hal tertentu, untuk melakukan pencarian wildcard), dan kemudian memanggil Uninstallmetode untuk masing-masingnya:

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

Ƭᴇcʜιᴇ007
sumber
5

Jika Anda tahu di mana file penginstal MSI, Anda dapat menggunakan:

Msiexec / uninstall Application.msi / quiet

Steve
sumber
5

Jika suatu program menggunakan Pemasang Windows, Anda dapat menggunakan salah satu dari perintah berikut:

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

Namun, Anda mungkin tidak memiliki kode produk atau file MSI asli yang digunakan untuk instalasi.

Selain itu, tidak ada perintah uninstall generik, karena installer yang tidak menggunakan Windows Installer "tidak dikenal" oleh sistem operasi. Mereka mungkin menyediakan executable uninstall mereka sendiri, tetapi apakah executable itu termasuk cara untuk menjalankannya tanpa GUI tergantung pada paket perangkat lunak individu.

Stephen Jennings
sumber
1

Skrip VBScript akan membantu Anda menghapus instalasi program yang diperlukan.

Untuk menggunakan skrip ini, Anda akan memerlukan nama perangkat lunak yang terletak di registri Anda.

Cukup masukkan nama aplikasi dalam skrip dan jalankan dengan hak admin; itu akan menghapus aplikasi. Tetapi ini hanya akan berfungsi untuk aplikasi berbasis jendela; untuk penyiapan mandiri atau aplikasi yang tidak membuat entri dalam rangkaian pencopotan registri, skrip tidak akan berfungsi.

Jadi dalam hal ini Anda harus menemukan cara lain untuk menghapus instalasi aplikasi.

Kode:

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
Vino
sumber
1

Lihat ini, ini menggunakan batch menemukan kunci registri UninstallString perangkat lunak dan kemudian uninstall perangkat lunak diam-diam yang jauh lebih dapat diandalkan dibandingkan dengan wmic yang saya temukan. 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
Marcus Zheng
sumber
0

Jawaban yang benar ada di atas, tetapi untuk instalasi Windows X64 Anda juga perlu memeriksa:

HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
bunga api
sumber