2016-01-13 6 views
0

Привет Я пытался удалить продукт, используя код GUID, он работал хорошо, когда я непосредственно запускал его в командной строке, однако, я получаю сообщение об ошибке при попытке запустить его с помощью GolangУдаление приложения его GUID

Мой код:

// 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)) 
} 

выход:

статус эээ :: выход 2147749911

из ::

Заранее спасибо

+1

Как этот вопрос связан с powershell? –

ответ

2

(Этот вопрос, по большей части не имеет ничего общего с Go.)

Пару вещей отметить, хотя:

  1. Не звоните в cmd.exe: он предназначен для запуска скриптов, и вы не запускаете скрипт, а просто вызываете программу. Таким образом, ваш вызов становится

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

    (Обратите внимание на использование обратных кавычек, чтобы сделать «сырую» строку — это помогает предотвратить «backslashity».

  2. Вы не захватить стандартный поток ошибок программы вы работаете

    Рассмотрим с помощью CombinedOutput() из exec.Cmd типа

    Один другой пункт:.. если ваша программа Go не имеет «GUI» подсистемы (то есть, не InTe для запуска в консольном окне), как правило, более разумно просто позволить выпущенной программе выводить все, что она выводит, на тот же носитель, что и его хост-процесс. Чтобы сделать это, вы просто подключить свои стандартные потоки тем вашего процесса:

    cmd := exec.Command("foo.exe", ...) 
    cmd.Stdin = os.Stdin 
    cmd.Stdout = os.Stdout 
    cmd.Stderr = os.Stderr 
    err := cmd.Run() 
    
  3. Вам не нужно wmic либо — просто взывать к msiexec непосредственно:

    msiexec.exe /uninstall {GUID} 
    

    Причина заключается в том, что wmic в конечном итоге вызовет msiexec, потому что нет другого способа удалить приложение Windows, кроме вызова его деинсталлятора.