2016-01-13 1 views
0

Salut j'ai essayé de désinstaller un produit en utilisant un GUID, il a bien fonctionné quand je directement exécuté dans l'invite de commande cependant, je reçois un message d'erreur lorsque je tente de l'exécuter en utilisant golangDésinstaller une application par son GUID

mon code:

// Powershell_Command 
package main 

import (
    "fmt" 
    "os/exec" 
) 

func main() { 
    out, err := exec.Command("cmd","/C","wmic","product","where","IdentifyingNumber=\"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\"","call","uninstall").Output() 
    fmt.Println("err::",err) 
    fmt.Println("out::",string(out)) 
} 

la sortie est:

err :: état de sortie 2147749911

sur ::

Merci à l'avance

+1

Comment cette question est liée à powershell? –

Répondre

2

(Cette question, pour la plupart n'a rien à voir avec Go.)

Un couple de choses à noter cependant:

  1. Ne pas appelez au cmd.exe: c'est pour exécuter des scripts, et vous n'exécutez pas un script mais simplement appelez un programme. Donc, votre appel devient

    out, err := exec.Command("wmic.exe", "product", "where", 
         `IdentifyingNumber="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"`, 
         "call", "uninstall").Output() 
    

    (Notez l'utilisation des backquotes pour faire une chaîne « brute » — cette aide à éviter « backslashity ».

  2. Vous ne prenez pas le flux d'erreur standard du programme vous utilisez

    Pensez à utiliser la CombinedOutput() du type exec.Cmd

    Un autre point:.. à moins que votre programme Go est du sous-système « GUI » (c'est pas inte nded pour s'exécuter dans une fenêtre de console), il est généralement plus judicieux de laisser le programme engendré produire tout ce qu'il produit sur le même support que son processus hôte. Pour ce faire, connectez-vous simplement ses flux standards à ceux de votre processus:

    cmd := exec.Command("foo.exe", ...) 
    cmd.Stdin = os.Stdin 
    cmd.Stdout = os.Stdout 
    cmd.Stderr = os.Stderr 
    err := cmd.Run() 
    
  3. Vous n'avez pas besoin wmic soit — il suffit d'appeler vers msiexec directement:

    msiexec.exe /uninstall {GUID} 
    

    La raison en est que wmic finira par appeler msiexec de toute façon, car il n'y a pas d'autre moyen de désinstaller une application Windows autre que l'appel de son programme de désinstallation.