通过 GUID 卸载应用程序

Uninstalling an application by its GUID

您好,我尝试使用 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))
}

输出为:

err:: exit status 2147749911

out::

提前致谢

(此题大部分与围棋无关。)

不过有几点需要注意:

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

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

    (注意使用反引号来构成 "raw" 字符串——这有助于防止 "backslashity".

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

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

    还有一点:除非你的 Go 程序属于 "GUI" 子系统(也就是说,不打算在控制台 window 中 运行),否则通常更明智的做法是让spawned 程序输出它输出到与其宿主进程相同的媒体的任何内容。为此,您只需将其标准流连接到您的流程:

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