通过GUID卸载应用程序

时间:2016-01-13 07:57:09

标签: go windows-installer uninstall wmic msiexec

您好我尝试使用GUID卸载产品,当我在命令提示符下直接执行它时它工作正常但是,当我尝试使用Golang执行它时收到错误消息

我的代码:

// 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 个答案:

答案 0 :(得分:2)

(这个问题大部分与Go无关。)

但有几点需要注意:

  1. 不要调用cmd.exe:它是用于运行脚本,而不是运行脚本而只是调用程序。所以你的电话就变成了

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

    (注意使用反引号来制作一个“原始”字符串 - 这有助于防止“反斜杠”。

  2. 您没有抓住正在运行的程序的标准错误流。

    考虑使用CombinedOutput()类型的exec.Cmd

    另一点:除非你的Go程序是“GUI”子系统(也就是说,不打算在控制台窗口中运行),否则让生成的程序输出任何输出到同一媒体的信息通常更为明智。主持人进程。为此,您只需将其标准流连接到您的流程:

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