2016-01-13 21 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)) 
} 

輸出爲:

ERR ::退出狀態2147749911

出::

由於提前

+1

這個問題如何與PowerShell相關? –

回答

2

(這在大多數情況下問題無關一起去。)

一對夫婦的事情,但要注意:

  1. 不要致電cmd.exe:它用於運行腳本,並且您不運行腳本,而只是調用一個程序。因此,您的通話變得

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

    (注意:反引號的使用做一個「原始」的字符串—這有助於防止「backslashity」。

  2. 你不搶程序的標準錯誤流您正在運行

    考慮使用的exec.Cmd類型的CombinedOutput()

    彼此一點:除非你的圍棋程序是「GUI」子系統(即不INTE nded在控制檯窗口中運行)通常讓產生的程序輸出任何它輸出到與其主機進程相同的媒體通常更明智。要做到這一點,你只是它的標準流連接到你的那些過程:

    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應用程序。