CMD를 통해 자동으로 프로그램 제거


답변:


19

Microsoft 지침에 따라 올바르게 설치되는 모든 프로그램은에 레지스트리 항목을 HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall만듭니다. 일반적으로 프로그램의 키는 GUID 또는 프로그램 이름입니다. 이 키 안에는이라는 항목이 있습니다 UninstallString. 프로그램을 제거하기 위해 실행하는 명령이 포함되어 있습니다.

제거 할 대상을 미리 알고 있다면이를 배치 파일에 넣는 것이 쉬워야합니다. 그래도 해당 프로세스를 자동화하려고하면 까다로워집니다. reg명령을 사용하여 레지스트리에서 데이터를 가져올 수 있지만 주어진 키의 실제 값 주위에 많은 텍스트를 반환하므로 사용하기가 어렵습니다. 레지스트리에서 변수로 데이터를 가져 오는 데 더 나은 옵션이 있으므로 VBscript 또는 PowerShell을 사용하여 실험 해 볼 수 있습니다.


26

WMIC를 사용하여 GUID 등을 몰라도 올바른 설치 제거 프로그램을 호출 할 수 있습니다.

Windows에서 내부적으로 알려진 프로그램 이름 목록을 보려면

wmic product get name

제품 이름을 찾으십시오. "프로그램 및 기능" 제어판에 나열된 것과 일치 하지만 항상 그런 것은 아닙니다.

그런 다음 사용할 수 있습니다

wmic product where name="_my_product_name" call uninstall

AFAIK가 자동 설치 제거를 수행하려면 (내 경험이 있었지만 팜에 베팅하기 전에 시도해보십시오. 자동 설치 프로그램 / 제거 프로그램의 빌드 방법에 따라 다를 수 있습니다).

자세한 내용은 여기를 참조하십시오.

microsoft.com에는 WMIC에 대한 참조 설명서도 있습니다.


2
/node:"<ComputerName>"ex : 를 추가하여 원격 컴퓨터에 대해이를 실행할 수 있습니다 wmic /node:"someuser-pc" product get name. 이름 주위에 ""를 사용하지 않으면 "잘못된 글로벌 스위치"오류가 발생합니다. 또한 "잘못된 글로벌 스위치"오류에 대한 ""해결 방법이 PowerShell 프롬프트에서 작동하지 않으므로 PowerShell 프롬프트가 아닌 CMD 프롬프트에서이를 실행해야합니다.
— Chris Magnuson

1
큰 대답이지만 작은 경고는 WMIC가 명령을 실행하는 데 상당한 시간이 걸릴 수 있다는 것입니다. 내 PC에서 제품을 나열하는 데 약 3 분이 걸렸습니다.
— SmacL

@SmacL. 나는 이것을 몇 번만 사용할 기회가 있었으며 시스템의 내용에 따라 시간이 걸릴 것이라고 믿을 수 있습니다.
— 카르노 안토니오 로메로

7

PowerShell 3 이상을 설치 한 경우 WMI 호출을 실행하여 특정 것으로 명명 된 모든 프로그램을 가져 오거나 와일드 카드 검색을 수행 할 Uninstall수 있습니다.

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


5

MSI 설치 관리자 파일이 어디에 있는지 알고 있다면 다음을 사용할 수 있습니다.

Msiexec / uninstall Application.msi / quiet


5

프로그램이 Windows Installer를 사용하는 경우 다음 명령 중 하나를 사용할 수 있습니다.

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

그러나 설치에 사용 된 제품 코드 나 원본 MSI 파일이 없을 수 있습니다.

그 외에는 Windows Installer를 사용하지 않는 설치 관리자가 운영 체제에서 "알 수 없음"이므로 일반 제거 명령이 없습니다. 자체 설치 제거 실행 파일을 제공 할 수 있지만 해당 실행 파일에 GUI없이 실행할 수있는 방법이 포함되어 있는지 여부는 개별 소프트웨어 패키지에 따라 다릅니다.


1

VBScript 스크립트는 require 프로그램을 제거하는 데 도움이됩니다.

이 스크립트를 사용하려면 레지스트리에있는 소프트웨어 이름이 필요합니다.

스크립트에 응용 프로그램 이름을 입력하고 관리자 권한으로 실행하십시오. 응용 프로그램이 제거됩니다. 그러나 이것은 창 기반 응용 프로그램에서만 작동합니다. 레지스트리의 제거 문자열에 항목을 작성하지 않는 독립형 설정 또는 앱의 경우 스크립트가 작동하지 않습니다.

따라서이 경우 응용 프로그램을 제거하는 다른 방법을 찾아야합니다.

암호:

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.