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.