Domanda

Esiste un modo semplice per agganciare la funzionalità standard " Aggiungi o rimuovi programmi 'usando PowerShell per disinstallare un'applicazione esistente ? O per verificare se l'applicazione è installata?

È stato utile?

Soluzione

$app = Get-WmiObject -Class Win32_Product | Where-Object { 
    
$app = Get-WmiObject -Class Win32_Product `
                     -Filter "Name = 'Software Name'"

Modifica: Rob ha trovato un altro modo per farlo con il parametro Filter:

<*>.Name -match "Software Name" } $app.Uninstall()

Modifica: Rob ha trovato un altro modo per farlo con il parametro Filter:

<*>

Altri suggerimenti

EDIT: Nel corso degli anni questa risposta ha ottenuto parecchi voti. Vorrei aggiungere alcuni commenti. Da allora non utilizzo PowerShell, ma ricordo di aver osservato alcuni problemi:

  1. Se ci sono più corrispondenze di 1 per lo script seguente, non funziona e devi aggiungere il filtro PowerShell che limita i risultati a 1. Credo che sia -Primo 1 ma non lo sono sicuro. Sentiti libero di modificare.
  2. Se l'applicazione non è installata da MSI, non funziona. Il motivo per cui è stato scritto come di seguito è perché modifica l'MSI per disinstallarlo senza intervento, che non è sempre il caso predefinito quando si utilizza la stringa di disinstallazione nativa.

L'uso dell'oggetto WMI richiede un'eternità. Questo è molto veloce se conosci solo il nome del programma che desideri disinstallare.

$uninstall32 = gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

EDIT: Nel corso degli anni questa risposta ha ottenuto parecchi voti. Vorrei aggiungere alcuni commenti. Da allora non utilizzo PowerShell, ma ricordo di aver osservato alcuni problemi:

  1. Se ci sono più corrispondenze di 1 per lo script seguente, non funziona e devi aggiungere il filtro PowerShell che limita i risultati a 1. Credo che sia -Primo 1 ma non lo sono sicuro. Sentiti libero di modificare.
  2. Se l'applicazione non è installata da MSI, non funziona. Il motivo per cui è stato scritto come di seguito è perché modifica l'MSI per disinstallarlo senza intervento, che non è sempre il caso predefinito quando si utilizza la stringa di disinstallazione nativa.

L'uso dell'oggetto WMI richiede un'eternità. Questo è molto veloce se conosci solo il nome del programma che desideri disinstallare.

<*>.PSPath } | ? {

EDIT: Nel corso degli anni questa risposta ha ottenuto parecchi voti. Vorrei aggiungere alcuni commenti. Da allora non utilizzo PowerShell, ma ricordo di aver osservato alcuni problemi:

  1. Se ci sono più corrispondenze di 1 per lo script seguente, non funziona e devi aggiungere il filtro PowerShell che limita i risultati a 1. Credo che sia -Primo 1 ma non lo sono sicuro. Sentiti libero di modificare.
  2. Se l'applicazione non è installata da MSI, non funziona. Il motivo per cui è stato scritto come di seguito è perché modifica l'MSI per disinstallarlo senza intervento, che non è sempre il caso predefinito quando si utilizza la stringa di disinstallazione nativa.

L'uso dell'oggetto WMI richiede un'eternità. Questo è molto veloce se conosci solo il nome del programma che desideri disinstallare.

<*> -match "SOFTWARE NAME" } | select UninstallString $uninstall64 = gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp

EDIT: Nel corso degli anni questa risposta ha ottenuto parecchi voti. Vorrei aggiungere alcuni commenti. Da allora non utilizzo PowerShell, ma ricordo di aver osservato alcuni problemi:

  1. Se ci sono più corrispondenze di 1 per lo script seguente, non funziona e devi aggiungere il filtro PowerShell che limita i risultati a 1. Credo che sia -Primo 1 ma non lo sono sicuro. Sentiti libero di modificare.
  2. Se l'applicazione non è installata da MSI, non funziona. Il motivo per cui è stato scritto come di seguito è perché modifica l'MSI per disinstallarlo senza intervento, che non è sempre il caso predefinito quando si utilizza la stringa di disinstallazione nativa.

L'uso dell'oggetto WMI richiede un'eternità. Questo è molto veloce se conosci solo il nome del programma che desideri disinstallare.

<*>.PSPath } | ? {

EDIT: Nel corso degli anni questa risposta ha ottenuto parecchi voti. Vorrei aggiungere alcuni commenti. Da allora non utilizzo PowerShell, ma ricordo di aver osservato alcuni problemi:

  1. Se ci sono più corrispondenze di 1 per lo script seguente, non funziona e devi aggiungere il filtro PowerShell che limita i risultati a 1. Credo che sia -Primo 1 ma non lo sono sicuro. Sentiti libero di modificare.
  2. Se l'applicazione non è installata da MSI, non funziona. Il motivo per cui è stato scritto come di seguito è perché modifica l'MSI per disinstallarlo senza intervento, che non è sempre il caso predefinito quando si utilizza la stringa di disinstallazione nativa.

L'uso dell'oggetto WMI richiede un'eternità. Questo è molto veloce se conosci solo il nome del programma che desideri disinstallare.

<*> -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}

Per correggere il secondo metodo nel post di Jeff Hillman, puoi fare un:

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

o

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

Per aggiungere un po 'a questo post, dovevo essere in grado di rimuovere il software da più server. Ho usato la risposta di Jeff per guidarmi a questo:

Per prima cosa ho ottenuto un elenco di server, ho usato una AD , ma puoi fornire l'array di nomi di computer come desiderato:

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

Quindi li ho passati in rassegna, aggiungendo il parametro -computer alla query gwmi:

foreach($server in $computers){
    $app = Get-WmiObject -Class Win32_Product -computer $server | Where-Object {
        

Per aggiungere un po 'a questo post, dovevo essere in grado di rimuovere il software da più server. Ho usato la risposta di Jeff per guidarmi a questo:

Per prima cosa ho ottenuto un elenco di server, ho usato una AD , ma puoi fornire l'array di nomi di computer come desiderato:

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

Quindi li ho passati in rassegna, aggiungendo il parametro -computer alla query gwmi:

<*>

Ho usato la proprietà IdentifyingNumber per abbinare invece di nome, solo per essere sicuro di disinstallare l'applicazione corretta.

.IdentifyingNumber -match "5A5F312145AE-0252130-432C34-9D89-1" } $app.Uninstall() }

Ho usato la proprietà IdentifyingNumber per abbinare invece di nome, solo per essere sicuro di disinstallare l'applicazione corretta.

Ho scoperto che la classe Win32_Product non è consigliata perché avvia le riparazioni e non è ottimizzata per le query. Fonte

Ho trovato questo post di Sitaram Pamarthi con uno script da disinstallare se conosci la guida dell'app. Fornisce anche un altro script per cercare app molto velocemente qui .

  

Utilizzare in questo modo:. \ 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"
  

Ho scoperto che la classe Win32_Product non è consigliata perché avvia le riparazioni e non è ottimizzata per le query. Fonte

Ho trovato questo post di Sitaram Pamarthi con uno script da disinstallare se conosci la guida dell'app. Fornisce anche un altro script per cercare app molto velocemente qui .

  

Utilizzare in questo modo:. \ uninstall.ps1 -GUID   {C9E7751E-88ED-36CF-B610-71A1D262E906}

<*> 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"} }
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
                }
            }
        }
    }
}

Chiamalo in questo modo:

Uninstall-App "Autodesk Revit DB Link 2019"

Farò il mio piccolo contributo. Avevo bisogno di rimuovere un elenco di pacchetti dallo stesso computer. Questa è la sceneggiatura che mi è venuta in mente.

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

Farò il mio piccolo contributo. Avevo bisogno di rimuovere un elenco di pacchetti dallo stesso computer. Questa è la sceneggiatura che mi è venuta in mente.

<*>

Spero che questo si riveli utile.

Nota che devo a David Stetler il merito di questo script poiché è basato sul suo.

.Name -match "$package" } $app.Uninstall() }

Spero che questo si riveli utile.

Nota che devo a David Stetler il merito di questo script poiché è basato sul suo.

Ecco lo script di PowerShell che utilizza msiexec:

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"

Una riga di codice:

get-package *notepad* |% { & 

Una riga di codice:

<*>.Meta.Attributes["UninstallString"]}

Basato sulla risposta di Jeff Hillman:

Ecco una funzione che puoi semplicemente aggiungere al tuo profile.ps1 o definire nella sessione corrente di PowerShell:

# 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 + "'")
    }
}

Diciamo che volevi disinstallare Notepad ++ . Basta digitare questo in PowerShell:

> disinstallare (" notepad ++ ")

Basta essere consapevoli del fatto che Get-WmiObject può richiedere del tempo, quindi sii paziente!

Usa:

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 |%{

Usa:

<*>

Non è completamente testato, ma è stato eseguito in PowerShell 4.

Ho eseguito il file PS1 come è visto qui. Consentendo di recuperare tutti i sistemi da AD e tentando di disinstallare più applicazioni su tutti i sistemi.

Ho usato il numero di identificazione per cercare la causa del software dell'input di David Stetlers.

Non testato:

  1. Non aggiungendo ID alla chiamata della funzione nello script, ma avviando invece lo script con ID parametro
  2. Chiamare lo script con più di 1 nome computer non recuperato automaticamente dalla funzione
  3. Recupero dei dati dalla pipe
  4. Uso degli indirizzi IP per connettersi al sistema

Cosa non fa:

  1. Non fornisce alcuna informazione se il software è stato effettivamente trovato su un determinato sistema.
  2. Non fornisce alcuna informazione sull'errore o sulla riuscita della disinstallazione.

Non sono stato in grado di utilizzare uninstall (). Provando ad avere un errore che mi dice che non è possibile chiamare un metodo per un'espressione che ha un valore NULL. Invece ho usato Remove-WmiObject, che sembra realizzare lo stesso.

ATTENZIONE : senza un nome computer dato, il software viene rimosso da TUTTI in Active Directory.

.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}"

Non è completamente testato, ma è stato eseguito in PowerShell 4.

Ho eseguito il file PS1 come è visto qui. Consentendo di recuperare tutti i sistemi da AD e tentando di disinstallare più applicazioni su tutti i sistemi.

Ho usato il numero di identificazione per cercare la causa del software dell'input di David Stetlers.

Non testato:

  1. Non aggiungendo ID alla chiamata della funzione nello script, ma avviando invece lo script con ID parametro
  2. Chiamare lo script con più di 1 nome computer non recuperato automaticamente dalla funzione
  3. Recupero dei dati dalla pipe
  4. Uso degli indirizzi IP per connettersi al sistema

Cosa non fa:

  1. Non fornisce alcuna informazione se il software è stato effettivamente trovato su un determinato sistema.
  2. Non fornisce alcuna informazione sull'errore o sulla riuscita della disinstallazione.

Non sono stato in grado di utilizzare uninstall (). Provando ad avere un errore che mi dice che non è possibile chiamare un metodo per un'espressione che ha un valore NULL. Invece ho usato Remove-WmiObject, che sembra realizzare lo stesso.

ATTENZIONE : senza un nome computer dato, il software viene rimosso da TUTTI in Active Directory.

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

 [array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

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

32 bit:

$uninstallResult = (Get-WMIObject -List -Verbose | Where-Object {

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

 [array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

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

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

.PSPath } | ? {

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

<*>

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

-match $programName } | select UninstallString

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

.PSPath } | ? {

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

<*>

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

.PSPath } | ? {

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

<*>

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

-match $programName } | select UninstallString

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

-match $programName } | select UninstallString

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

.PSPath } | ? {

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

<*>

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

-match $programName } | select UninstallString

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

.Name -eq "Win32_Process"}).InvokeMethod("Create","$unInstallPath")

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

.PSPath } | ? {

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

<*>

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

-match $programName } | select UninstallString

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

.PSPath } | ? {

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

<*>

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

.PSPath } | ? {

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

<*>

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

-match $programName } | select UninstallString

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

-match $programName } | select UninstallString

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

.PSPath } | ? {

Per la maggior parte dei miei programmi gli script in questo post hanno fatto il lavoro. Ma ho dovuto affrontare un programma legacy che non potevo rimuovere usando la classe msiexec.exe o Win32_Product. (per qualche motivo ho ottenuto l'uscita 0 ma il programma era ancora lì)

La mia soluzione era usare la classe Win32_Process:

con l'aiuto di nickdnk questo comando serve per ottenere il percorso del file exe di disinstallazione:

64 bit:

<*>

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

-match $programName } | select UninstallString

32 bit:

<*>

dovrai pulire la stringa del risultato:

<*>

ora quando hai il programma pertinente disinstallare il percorso del file exe puoi usare questo comando:

<*>
  

$ uninstallResult - avrà il codice di uscita. 0 è successo

i comandi precedenti possono anche essere eseguiti in remoto - l'ho fatto usando il comando invoke ma credo che l'aggiunta dell'argomento -computername possa funzionare

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top