मैं PowerShell का उपयोग करके किसी एप्लिकेशन को कैसे अनइंस्टॉल कर सकता हूं?


136

क्या मौजूदा एप्लिकेशन को अनइंस्टॉल करने के लिए PowerShell का उपयोग करके प्रोग्राम की कार्यक्षमता को मानक में हुक करने का एक सरल तरीका है ? या यह जांचने के लिए कि क्या एप्लिकेशन इंस्टॉल है?

जवाबों:


160
$app = Get-WmiObject -Class Win32_Product | Where-Object { 
    $_.Name -match "Software Name" 
}

$app.Uninstall()

संपादित करें: रोब ने इसे फ़िल्टर पैरामीटर के साथ करने का एक और तरीका पाया:

$app = Get-WmiObject -Class Win32_Product `
                     -Filter "Name = 'Software Name'"

1
यह बहुत ज्यादा है, मैं कहूंगा कि केवल नाम के बजाय आइडेंटिफ़िनम्बर का उपयोग करना बेहतर हो सकता है।
टब

6
थोड़े शोध के बाद आप Get-WmiObject का $ -filter क्लॉज भी उपयोग कर सकते हैं: $ app = Get-WmiObject -Class Win32_Product -filter "Win32_Product यहाँ से नाम चुनें '=' ​​सॉफ्टवेयर का नाम 'चुनें
Rob Paterson

8
ध्यान दें कि डब्लूएमआई केवल उन उत्पादों के लिए काम करेगा जो एमएसआई के माध्यम से स्थापित किए गए थे।
ईबीग्रीन

7
यह WMI वर्ग आगे ले जाता है। मैं जेफ को सुझाव देता हूं कि आप रोब के टिप को शामिल करने के लिए अपने कोड को अपडेट करें।
halr9000

4
(gwmi Win32_Product | ? Name -eq "Software").uninstall() थोड़ा कोड गोल्फ।
राउंडर

51

EDIT: पिछले कुछ वर्षों में इस उत्तर में काफी वृद्धि हुई है। मैं कुछ टिप्पणियां जोड़ना चाहूंगा। मैंने तब से PowerShell का उपयोग नहीं किया है, लेकिन मुझे याद है कि मैं कुछ मुद्दों का अवलोकन कर रहा हूं:

  1. यदि नीचे की स्क्रिप्ट के लिए 1 से अधिक मिलान हैं, तो यह काम नहीं करता है और आपको PowerShell फ़िल्टर को जोड़ना होगा, जिसके परिणाम 1 तक सीमित हैं। ऐसा मानना ​​है कि -First 1 लेकिन मुझे यकीन नहीं है। बेझिझक संपादित करें।
  2. यदि अनुप्रयोग MSI द्वारा स्थापित नहीं है, तो यह काम नहीं करता है। इसका कारण नीचे लिखा गया था, क्योंकि यह MSI को बिना किसी हस्तक्षेप के अनइंस्टॉल करने के लिए संशोधित करता है, जो कि मूल अनइंस्टॉल स्ट्रिंग का उपयोग करते समय हमेशा डिफ़ॉल्ट मामला नहीं होता है।

WMI ऑब्जेक्ट का उपयोग करना हमेशा के लिए होता है। यह बहुत तेज़ है यदि आप केवल उस प्रोग्राम का नाम जानते हैं जिसे आप अनइंस्टॉल करना चाहते हैं।

$uninstall32 = gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "SOFTWARE NAME" } | select UninstallString
$uninstall64 = gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "SOFTWARE NAME" } | select UninstallString

if ($uninstall64) {
$uninstall64 = $uninstall64.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall64 = $uninstall64.Trim()
Write "Uninstalling..."
start-process "msiexec.exe" -arg "/X $uninstall64 /qb" -Wait}
if ($uninstall32) {
$uninstall32 = $uninstall32.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall32 = $uninstall32.Trim()
Write "Uninstalling..."
start-process "msiexec.exe" -arg "/X $uninstall32 /qb" -Wait}

1
इसके लिए धन्यवाद! मैं इसका उपयोग करने की कोशिश कर रहा हूं -like "appNam*"क्योंकि संस्करण नाम में है और यह बदलता है, लेकिन यह प्रोग्राम को खोजने के लिए प्रतीत नहीं होता है। कोई विचार?
NSouth

1
Powerhell के लिए समान प्रकार का फ़ंक्शन देखें, यह पता करें कि किस तरह से अपने स्ट्रिंग को सही ढंग से मेल खाने के लिए फ़िल्टर का उपयोग करें। परीक्षण करने के लिए केवल शेल का उपयोग करें, और एक बार जब आप इसे ठीक कर लेते हैं -match को प्रतिस्थापित कर दें :)
nicdnk

2
यह सोना है। निजी तौर पर, मैं 'b' को '/ qb' से हटा देता हूं ताकि आपको कोई संवाद न देखना पड़े।
व्हाइटहोटलवेटिगर

बहुत जल्दी :-)
ऑस्कर फोली

3
मैंने इसे एक .ps1 स्क्रिप्ट में प्रॉम्प्ट और एक "मैं किस बारे में अनइंस्टॉल कर रहा हूं" जानकारी में बदल दिया। gist.github.com/chrisfcarroll/e38b9ffcc52fa9d4eb9ab73b13915f5a
क्रिस एफ कैरोल

34

जेफ हिलमैन की पोस्ट में दूसरी विधि को ठीक करने के लिए, आप या तो एक कर सकते हैं:

$app = Get-WmiObject 
            -Query "SELECT * FROM Win32_Product WHERE Name = 'Software Name'"

या

$app = Get-WmiObject -Class Win32_Product `
                     -Filter "Name = 'Software Name'"

बस एक सिर-अप ... मैंने पाया कि "-Filter" विकल्प के बजाय "-Query" का उपयोग करने से WmiObject वापस नहीं आया, इसलिए इसमें "अनइंस्टॉल" विधि नहीं थी।
डग जे। हुरस

7

मुझे पता चला कि Win32_Product वर्ग अनुशंसित नहीं है क्योंकि यह मरम्मत को ट्रिगर करता है और क्वेरी अनुकूलित नहीं है। स्रोत

मुझे सीताराम परमार्थी की यह पोस्ट स्क्रिप्ट के साथ अनइंस्टॉल करने के लिए मिली, यदि आप ऐप गाइड जानते हैं। वह यहां वास्तव में तेजी से ऐप्स खोजने के लिए एक और स्क्रिप्ट की आपूर्ति भी करता है

इस तरह का उपयोग करें:। \ Uninstall.ps1 -GUID {C9E7751E-88ED-36CF-B610-71A1D262E906}

[cmdletbinding()]            

param (            

 [parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
 [string]$ComputerName = $env:computername,
 [parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true,Mandatory=$true)]
 [string]$AppGUID
)            

 try {
  $returnval = ([WMICLASS]"\\$computerName\ROOT\CIMV2:win32_process").Create("msiexec `/x$AppGUID `/norestart `/qn")
 } catch {
  write-error "Failed to trigger the uninstallation. Review the error message"
  $_
  exit
 }
 switch ($($returnval.returnvalue)){
  0 { "Uninstallation command triggered successfully" }
  2 { "You don't have sufficient permissions to trigger the command on $Computer" }
  3 { "You don't have sufficient permissions to trigger the command on $Computer" }
  8 { "An unknown error has occurred" }
  9 { "Path Not Found" }
  9 { "Invalid Parameter"}
 }

7

इस पोस्ट में थोड़ा सा जोड़ने के लिए, मुझे कई सर्वर से सॉफ़्टवेयर निकालने में सक्षम होना चाहिए। मैंने जेफ के जवाब का इस्तेमाल करते हुए मुझे इस तक पहुंचा दिया:

पहले मुझे सर्वरों की एक सूची मिली, मैंने एक AD क्वेरी का उपयोग किया , लेकिन आप कंप्यूटर नामों की सरणी प्रदान कर सकते हैं, जो आप चाहते हैं:

$computers = @("computer1", "computer2", "computer3")

तब मैंने उनके माध्यम से लूप किया था, जो कि gwmi क्वेरी में -computer पैरामीटर जोड़ रहा था:

foreach($server in $computers){
    $app = Get-WmiObject -Class Win32_Product -computer $server | Where-Object {
        $_.IdentifyingNumber -match "5A5F312145AE-0252130-432C34-9D89-1"
    }
    $app.Uninstall()
}

मैंने नाम के बजाय मिलान करने के लिए IdentifyNumber संपत्ति का उपयोग किया, बस यह सुनिश्चित करने के लिए कि मैं सही एप्लिकेशन की स्थापना रद्द कर रहा हूं।


बस इस समाधान प्यारा
Raffaeu

6
function Uninstall-App {
    Write-Output "Uninstalling $($args[0])"
    foreach($obj in Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall") {
        $dname = $obj.GetValue("DisplayName")
        if ($dname -contains $args[0]) {
            $uninstString = $obj.GetValue("UninstallString")
            foreach ($line in $uninstString) {
                $found = $line -match '(\{.+\}).*'
                If ($found) {
                    $appid = $matches[1]
                    Write-Output $appid
                    start-process "msiexec.exe" -arg "/X $appid /qb" -Wait
                }
            }
        }
    }
}

इसे इस तरह से कॉल करें:

Uninstall-App "Autodesk Revit DB Link 2019"


3

मैं अपना छोटा योगदान दूंगा। मुझे उसी कंप्यूटर से संकुल की सूची निकालने की आवश्यकता थी। यह वह स्क्रिप्ट है जिसके साथ मैं आया था।

$packages = @("package1", "package2", "package3")
foreach($package in $packages){
  $app = Get-WmiObject -Class Win32_Product | Where-Object {
    $_.Name -match "$package"
  }
  $app.Uninstall()
}

मुझे उम्मीद है कि यह उपयोगी साबित होगा।

ध्यान दें कि मैं डेविड स्टीटलर को इस स्क्रिप्ट का श्रेय देता हूं क्योंकि यह उसके आधार पर है।


2

यहाँ msiexec का उपयोग कर PowerShell स्क्रिप्ट दी गई है:

echo "Getting product code"
$ProductCode = Get-WmiObject win32_product -Filter "Name='Name of my Software in Add Remove Program Window'" | Select-Object -Expand IdentifyingNumber
echo "removing Product"
# Out-Null argument is just for keeping the power shell command window waiting for msiexec command to finish else it moves to execute the next echo command
& msiexec /x $ProductCode | Out-Null
echo "uninstallation finished"

मैंने इस दृष्टिकोण को निम्नलिखित झंडे के साथ जोड़ दिया , किसी कारण से यह मेरे लिए अन्य दृष्टिकोणों से बेहतर काम करता है।
डेविड रोजर्स

1

जेफ हिलमैन के जवाब पर आधारित:

यहां एक ऐसा कार्य है जिसे आप केवल profile.ps1वर्तमान पावर सत्र में जोड़ सकते हैं या परिभाषित कर सकते हैं :

# Uninstall a Windows program
function uninstall($programName)
{
    $app = Get-WmiObject -Class Win32_Product -Filter ("Name = '" + $programName + "'")
    if($app -ne $null)
    {
        $app.Uninstall()
    }
    else {
        echo ("Could not find program '" + $programName + "'")
    }
}

मान लीजिए कि आप नोटपैड ++ की स्थापना रद्द करना चाहते हैं । इसे PowerShell में लिखें:

> uninstall("notepad++")

बस ध्यान रहे कि Get-WmiObjectकुछ समय लग सकता है, इसलिए धैर्य रखें!


0

उपयोग:

function remove-HSsoftware{
[cmdletbinding()]
param(
[parameter(Mandatory=$true,
ValuefromPipeline = $true,
HelpMessage="IdentifyingNumber can be retrieved with `"get-wmiobject -class win32_product`"")]
[ValidatePattern('{[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}}')]
[string[]]$ids,
[parameter(Mandatory=$false,
            ValuefromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Computer name or IP adress to query via WMI")]
[Alias('hostname,CN,computername')]
[string[]]$computers
)
begin {}
process{
    if($computers -eq $null){
    $computers = Get-ADComputer -Filter * | Select dnshostname |%{$_.dnshostname}
    }
    foreach($computer in $computers){
        foreach($id in $ids){
            write-host "Trying to uninstall sofware with ID ", "$id", "from computer ", "$computer"
            $app = Get-WmiObject -class Win32_Product -Computername "$computer" -Filter "IdentifyingNumber = '$id'"
            $app | Remove-WmiObject

        }
    }
}
end{}}
 remove-hssoftware -ids "{8C299CF3-E529-414E-AKD8-68C23BA4CBE8}","{5A9C53A5-FF48-497D-AB86-1F6418B569B9}","{62092246-CFA2-4452-BEDB-62AC4BCE6C26}"

यह पूरी तरह से परीक्षण नहीं है, लेकिन यह पावरशेल 4 के तहत चला।

मैंने पीएस 1 फाइल को चलाया है क्योंकि यह यहाँ देखा गया है। इसे एडी से सभी सिस्टम को पुनः प्राप्त करते हैं और सभी सिस्टम पर कई एप्लिकेशन को अनइंस्टॉल करने की कोशिश करें।

मैंने डेविड स्टीटलर्स इनपुट के सॉफ़्टवेयर कारण की खोज करने के लिए IdentificationNumber का उपयोग किया है।

टेस्ट नहीं हुआ:

  1. स्क्रिप्ट को फंक्शन की कॉल में आईडी नहीं जोड़ना है, इसके बजाय स्क्रिप्ट को पैरामीटर आईडी के साथ शुरू करना है
  2. स्क्रिप्ट को अधिक तब 1 कंप्यूटर नाम के साथ कॉल करना नहीं स्वचालित रूप से फ़ंक्शन से पुनर्प्राप्त होता है
  3. पाइप से डेटा पुनर्प्राप्त करना
  4. सिस्टम से कनेक्ट करने के लिए आईपी पते का उपयोग करना

यह क्या नहीं है:

  1. यह किसी भी जानकारी नहीं देता है अगर सॉफ्टवेयर वास्तव में किसी भी सिस्टम पर पाया गया था।
  2. यह किसी भी विफलता या स्थापना की सफलता के बारे में कोई जानकारी नहीं देता है।

मैं स्थापना रद्द () का उपयोग करने में सक्षम नहीं था। यह कोशिश करना कि मुझे यह बताने में त्रुटि हुई कि NULL का मान रखने वाली अभिव्यक्ति के लिए एक विधि को कॉल करना संभव नहीं है। इसके बजाय मैंने Remove-WmiObject का उपयोग किया, जो समान को पूरा करता प्रतीत होता है।

चेतावनी : कंप्यूटर नाम दिए बिना यह सक्रिय निर्देशिका में सभी सिस्टम से सॉफ्टवेयर को हटा देता है ।


0

मेरे अधिकांश कार्यक्रमों के लिए इस पोस्ट की स्क्रिप्ट्स ने काम किया। लेकिन मुझे एक विरासत कार्यक्रम का सामना करना पड़ा जिसे मैं msiexec.exe या Win32_Product वर्ग का उपयोग करके नहीं निकाल सका। (किसी कारण से मैं 0 से बाहर हो गया लेकिन कार्यक्रम अभी भी था)

मेरा समाधान Win32_Process वर्ग का उपयोग करना था:

nickdnk की मदद से यह कमांड अनइंस्टॉल exe फ़ाइल पथ प्राप्त करने के लिए है:

64 बिट:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match $programName } | select UninstallString

32 बिट:

 [array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match $programName } | select UninstallString

आपको परिणाम स्ट्रिंग को साफ करना होगा:

$uninstallPath = $unInstallPathReg[0].UninstallString
$uninstallPath = $uninstallPath -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstallPath = $uninstallPath .Trim()

अब जब आपके पास प्रासंगिक प्रोग्राम की स्थापना रद्द करें exe फ़ाइल पथ है तो आप इस कमांड का उपयोग कर सकते हैं:

$uninstallResult = (Get-WMIObject -List -Verbose | Where-Object {$_.Name -eq "Win32_Process"}).InvokeMethod("Create","$unInstallPath")

$ uninstallResult - बाहर निकलने का कोड होगा। 0 सफलता है

उपरोक्त आदेश दूरस्थ रूप से भी चल सकते हैं - मैंने यह इनवोक कमांड का उपयोग करके किया था लेकिन मेरा मानना ​​है कि तर्क जोड़ना

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.