Question

Existe-t-il un moyen simple de se connecter à la fonctionnalité standard Ajout / Suppression de programmes avec PowerShell pour désinstaller une application existante ? Ou pour vérifier si l'application est installée?

Était-ce utile?

La solution

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

Modifier: Rob a trouvé un autre moyen de procéder avec le paramètre Filter:

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

Modifier: Rob a trouvé un autre moyen de procéder avec le paramètre Filter:

<*>

Autres conseils

EDIT: Au fil des ans, cette réponse a suscité pas mal de votes positifs. Je voudrais ajouter quelques commentaires. Je n'ai pas utilisé PowerShell depuis, mais je me souviens avoir observé certains problèmes:

  1. S'il y a plus de correspondances que 1 pour le script ci-dessous, cela ne fonctionne pas et vous devez ajouter le filtre PowerShell qui limite les résultats à 1. Je crois que c'est -First 1 mais je ne le suis pas. sûr. N'hésitez pas à modifier.
  2. Si l'application n'est pas installée par MSI, elle ne fonctionne pas. La raison pour laquelle il a été écrit comme suit est qu’elle modifie le MSI pour désinstaller sans intervention, ce qui n’est pas toujours le cas par défaut lors de l’utilisation de la chaîne de désinstallation native.

L'utilisation de l'objet WMI prend une éternité. C’est très rapide si vous ne connaissez que le nom du programme que vous souhaitez désinstaller.

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

EDIT: Au fil des ans, cette réponse a suscité pas mal de votes positifs. Je voudrais ajouter quelques commentaires. Je n'ai pas utilisé PowerShell depuis, mais je me souviens avoir observé certains problèmes:

  1. S'il y a plus de correspondances que 1 pour le script ci-dessous, cela ne fonctionne pas et vous devez ajouter le filtre PowerShell qui limite les résultats à 1. Je crois que c'est -First 1 mais je ne le suis pas. sûr. N'hésitez pas à modifier.
  2. Si l'application n'est pas installée par MSI, elle ne fonctionne pas. La raison pour laquelle il a été écrit comme suit est qu’elle modifie le MSI pour désinstaller sans intervention, ce qui n’est pas toujours le cas par défaut lors de l’utilisation de la chaîne de désinstallation native.

L'utilisation de l'objet WMI prend une éternité. C’est très rapide si vous ne connaissez que le nom du programme que vous souhaitez désinstaller.

<*>.PSPath } | ? {

EDIT: Au fil des ans, cette réponse a suscité pas mal de votes positifs. Je voudrais ajouter quelques commentaires. Je n'ai pas utilisé PowerShell depuis, mais je me souviens avoir observé certains problèmes:

  1. S'il y a plus de correspondances que 1 pour le script ci-dessous, cela ne fonctionne pas et vous devez ajouter le filtre PowerShell qui limite les résultats à 1. Je crois que c'est -First 1 mais je ne le suis pas. sûr. N'hésitez pas à modifier.
  2. Si l'application n'est pas installée par MSI, elle ne fonctionne pas. La raison pour laquelle il a été écrit comme suit est qu’elle modifie le MSI pour désinstaller sans intervention, ce qui n’est pas toujours le cas par défaut lors de l’utilisation de la chaîne de désinstallation native.

L'utilisation de l'objet WMI prend une éternité. C’est très rapide si vous ne connaissez que le nom du programme que vous souhaitez désinstaller.

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

EDIT: Au fil des ans, cette réponse a suscité pas mal de votes positifs. Je voudrais ajouter quelques commentaires. Je n'ai pas utilisé PowerShell depuis, mais je me souviens avoir observé certains problèmes:

  1. S'il y a plus de correspondances que 1 pour le script ci-dessous, cela ne fonctionne pas et vous devez ajouter le filtre PowerShell qui limite les résultats à 1. Je crois que c'est -First 1 mais je ne le suis pas. sûr. N'hésitez pas à modifier.
  2. Si l'application n'est pas installée par MSI, elle ne fonctionne pas. La raison pour laquelle il a été écrit comme suit est qu’elle modifie le MSI pour désinstaller sans intervention, ce qui n’est pas toujours le cas par défaut lors de l’utilisation de la chaîne de désinstallation native.

L'utilisation de l'objet WMI prend une éternité. C’est très rapide si vous ne connaissez que le nom du programme que vous souhaitez désinstaller.

<*>.PSPath } | ? {

EDIT: Au fil des ans, cette réponse a suscité pas mal de votes positifs. Je voudrais ajouter quelques commentaires. Je n'ai pas utilisé PowerShell depuis, mais je me souviens avoir observé certains problèmes:

  1. S'il y a plus de correspondances que 1 pour le script ci-dessous, cela ne fonctionne pas et vous devez ajouter le filtre PowerShell qui limite les résultats à 1. Je crois que c'est -First 1 mais je ne le suis pas. sûr. N'hésitez pas à modifier.
  2. Si l'application n'est pas installée par MSI, elle ne fonctionne pas. La raison pour laquelle il a été écrit comme suit est qu’elle modifie le MSI pour désinstaller sans intervention, ce qui n’est pas toujours le cas par défaut lors de l’utilisation de la chaîne de désinstallation native.

L'utilisation de l'objet WMI prend une éternité. C’est très rapide si vous ne connaissez que le nom du programme que vous souhaitez désinstaller.

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

Pour corriger la deuxième méthode dans le message de Jeff Hillman, vous pouvez soit faire un:

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

Ou

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

Pour ajouter un peu à ce message, je devais être en mesure de supprimer les logiciels de plusieurs serveurs. J'ai utilisé la réponse de Jeff pour me conduire à ceci:

Tout d’abord, j’ai eu une liste de serveurs, j’ai utilisé une requête AD , mais vous pouvez fournissez le tableau de noms d’ordinateurs comme vous le souhaitez:

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

Je les ai suivis en boucle, en ajoutant le paramètre -computer à la requête gwmi:

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

Pour ajouter un peu à ce message, je devais être en mesure de supprimer les logiciels de plusieurs serveurs. J'ai utilisé la réponse de Jeff pour me conduire à ceci:

Tout d’abord, j’ai eu une liste de serveurs, j’ai utilisé une requête AD , mais vous pouvez fournissez le tableau de noms d’ordinateurs comme vous le souhaitez:

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

Je les ai suivis en boucle, en ajoutant le paramètre -computer à la requête gwmi:

<*>

J'ai utilisé la propriété IdentifyingNumber pour faire correspondre ce nom au lieu de name, juste pour m'assurer de désinstaller l'application appropriée.

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

J'ai utilisé la propriété IdentifyingNumber pour faire correspondre ce nom au lieu de name, juste pour m'assurer de désinstaller l'application appropriée.

J'ai découvert que la classe Win32_Product n'est pas recommandée car elle déclenche des réparations et n'est pas optimisée pour les requêtes. Source

J'ai trouvé ce message de Sitaram Pamarthi avec un script à désinstaller si vous connaissez le guide d'application. Il fournit également un autre script permettant de rechercher des applications très rapidement. "> ici .

  

Utilisez comme ceci:. \ 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"
  

J'ai découvert que la classe Win32_Product n'est pas recommandée car elle déclenche des réparations et n'est pas optimisée pour les requêtes. Source

J'ai trouvé ce message de Sitaram Pamarthi avec un script à désinstaller si vous connaissez le guide d'application. Il fournit également un autre script permettant de rechercher des applications très rapidement. "> ici .

  

Utilisez comme ceci:. \ 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
                }
            }
        }
    }
}

Appelez ça comme ça:

Uninstall-App "Autodesk Revit DB Link 2019"

Je vais faire ma propre petite contribution. Je devais supprimer une liste de paquets du même ordinateur. C’est le script que j’ai imaginé.

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

Je vais faire ma propre petite contribution. Je devais supprimer une liste de paquets du même ordinateur. C’est le script que j’ai imaginé.

<*>

J'espère que cela s'avérera utile.

Notez que je dois à David Stetler le mérite de ce script puisqu'il est basé sur le sien.

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

J'espère que cela s'avérera utile.

Notez que je dois à David Stetler le mérite de ce script puisqu'il est basé sur le sien.

Voici le script PowerShell utilisant 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"

Une ligne de code:

get-package *notepad* |% { & 

Une ligne de code:

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

D'après la réponse de Jeff Hillman:

Voici une fonction que vous pouvez simplement ajouter à votre profile.ps1 ou définir dans la session PowerShell en cours:

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

Supposons que vous souhaitiez désinstaller Notepad ++ . Il suffit de taper ceci dans PowerShell:

> désinstaller ("notepad ++")

Sachez que Get-WmiObject peut prendre un certain temps, soyez donc patient!

Utiliser:

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

Utiliser:

<*>

Ce n'est pas complètement testé, mais il fonctionnait sous PowerShell 4.

J'ai exécuté le fichier PS1 tel qu'il est vu ici. Le laisser récupérer tous les systèmes de la AD et tenter de désinstaller plusieurs applications sur tous les systèmes.

J'ai utilisé IdentifyingNumber pour rechercher la cause logicielle de l'entrée de David Stetlers.

Non testé:

  1. N'ajoutant pas d'identifiants à l'appel de la fonction dans le script, démarrant le script avec des identifiants de paramètre
  2. Appel du script avec plus d'un nom d'ordinateur non récupéré automatiquement à partir de la fonction
  3. Récupération de données du canal
  4. Utilisation d'adresses IP pour se connecter au système

Ce qu'il ne fait pas:

  1. Cela ne donne aucune information si le logiciel a été trouvé sur un système donné.
  2. Il ne donne aucune information sur l'échec ou le succès de la désinstallation.

Je n'ai pas pu utiliser uninstall (). Essayer d'obtenir une erreur me disant qu'appeler une méthode pour une expression ayant la valeur NULL n'est pas possible. Au lieu de cela, j’ai utilisé Remove-WmiObject, qui semble avoir le même résultat.

ATTENTION : L'absence de nom d'ordinateur supprime le logiciel des systèmes ALL dans 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}"

Ce n'est pas complètement testé, mais il fonctionnait sous PowerShell 4.

J'ai exécuté le fichier PS1 tel qu'il est vu ici. Le laisser récupérer tous les systèmes de la AD et tenter de désinstaller plusieurs applications sur tous les systèmes.

J'ai utilisé IdentifyingNumber pour rechercher la cause logicielle de l'entrée de David Stetlers.

Non testé:

  1. N'ajoutant pas d'identifiants à l'appel de la fonction dans le script, démarrant le script avec des identifiants de paramètre
  2. Appel du script avec plus d'un nom d'ordinateur non récupéré automatiquement à partir de la fonction
  3. Récupération de données du canal
  4. Utilisation d'adresses IP pour se connecter au système

Ce qu'il ne fait pas:

  1. Cela ne donne aucune information si le logiciel a été trouvé sur un système donné.
  2. Il ne donne aucune information sur l'échec ou le succès de la désinstallation.

Je n'ai pas pu utiliser uninstall (). Essayer d'obtenir une erreur me disant qu'appeler une méthode pour une expression ayant la valeur NULL n'est pas possible. Au lieu de cela, j’ai utilisé Remove-WmiObject, qui semble avoir le même résultat.

ATTENTION : L'absence de nom d'ordinateur supprime le logiciel des systèmes ALL dans Active Directory.

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

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

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

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

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

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

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

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

32bit:

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

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

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

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

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

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

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

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

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

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

.PSPath } | ? {

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

<*>

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

-match $programName } | select UninstallString

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

.PSPath } | ? {

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

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

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

<*>

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

.PSPath } | ? {

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

<*>

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

-match $programName } | select UninstallString

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

-match $programName } | select UninstallString

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

.PSPath } | ? {

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

<*>

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

-match $programName } | select UninstallString

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

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

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

.PSPath } | ? {

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

<*>

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

-match $programName } | select UninstallString

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

.PSPath } | ? {

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

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

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

<*>

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

.PSPath } | ? {

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

<*>

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

-match $programName } | select UninstallString

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

-match $programName } | select UninstallString

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

.PSPath } | ? {

Pour la plupart de mes programmes, les scripts de cet article ont fait le travail. Mais je devais faire face à un programme existant que je ne pouvais pas supprimer à l'aide de la classe msiexec.exe ou Win32_Product. (pour une raison quelconque, j'ai eu la sortie 0 mais le programme était toujours là)

Ma solution consistait à utiliser la classe Win32_Process:

à l'aide de nickdnk , cette commande permet d'obtenir le chemin du fichier d'installation EXE:

64 bits:

<*>

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

-match $programName } | select UninstallString

32bit:

<*>

vous devrez nettoyer la chaîne de résultat:

<*>

Maintenant, lorsque vous avez le chemin du fichier exe de désinstallation du programme approprié , vous pouvez utiliser cette commande:

<*>
  

$ uninstallResult - aura le code de sortie. 0 est le succès

les commandes ci-dessus peuvent aussi être exécutées à distance - je l'ai fait en utilisant la commande invoke mais je pense que l'ajout de l'argument -nomordinateur peut fonctionner

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top