답변:
Microsoft 지침에 따라 올바르게 설치되는 모든 프로그램은에 레지스트리 항목을 HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
만듭니다. 일반적으로 프로그램의 키는 GUID 또는 프로그램 이름입니다. 이 키 안에는이라는 항목이 있습니다 UninstallString
. 프로그램을 제거하기 위해 실행하는 명령이 포함되어 있습니다.
제거 할 대상을 미리 알고 있다면이를 배치 파일에 넣는 것이 쉬워야합니다. 그래도 해당 프로세스를 자동화하려고하면 까다로워집니다. reg
명령을 사용하여 레지스트리에서 데이터를 가져올 수 있지만 주어진 키의 실제 값 주위에 많은 텍스트를 반환하므로 사용하기가 어렵습니다. 레지스트리에서 변수로 데이터를 가져 오는 데 더 나은 옵션이 있으므로 VBscript 또는 PowerShell을 사용하여 실험 해 볼 수 있습니다.
WMIC를 사용하여 GUID 등을 몰라도 올바른 설치 제거 프로그램을 호출 할 수 있습니다.
Windows에서 내부적으로 알려진 프로그램 이름 목록을 보려면
wmic product get name
제품 이름을 찾으십시오. "프로그램 및 기능" 제어판에 나열된 것과 일치 하지만 항상 그런 것은 아닙니다.
그런 다음 사용할 수 있습니다
wmic product where name="_my_product_name" call uninstall
AFAIK가 자동 설치 제거를 수행하려면 (내 경험이 있었지만 팜에 베팅하기 전에 시도해보십시오. 자동 설치 프로그램 / 제거 프로그램의 빌드 방법에 따라 다를 수 있습니다).
자세한 내용은 여기를 참조하십시오.
microsoft.com에는 WMIC에 대한 참조 설명서도 있습니다.
프로그램이 Windows Installer를 사용하는 경우 다음 명령 중 하나를 사용할 수 있습니다.
msiexec /q /x <ProductCodeGuid>
msiexec /q /x <PathToMsi>
그러나 설치에 사용 된 제품 코드 나 원본 MSI 파일이 없을 수 있습니다.
그 외에는 Windows Installer를 사용하지 않는 설치 관리자가 운영 체제에서 "알 수 없음"이므로 일반 제거 명령이 없습니다. 자체 설치 제거 실행 파일을 제공 할 수 있지만 해당 실행 파일에 GUI없이 실행할 수있는 방법이 포함되어 있는지 여부는 개별 소프트웨어 패키지에 따라 다릅니다.
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
이것을 확인하십시오.이 배치를 사용하여 소프트웨어의 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
/node:"<ComputerName>"
ex : 를 추가하여 원격 컴퓨터에 대해이를 실행할 수 있습니다wmic /node:"someuser-pc" product get name
. 이름 주위에 ""를 사용하지 않으면 "잘못된 글로벌 스위치"오류가 발생합니다. 또한 "잘못된 글로벌 스위치"오류에 대한 ""해결 방법이 PowerShell 프롬프트에서 작동하지 않으므로 PowerShell 프롬프트가 아닌 CMD 프롬프트에서이를 실행해야합니다.