Go 按GUID卸载应用程序

Go 按GUID卸载应用程序,go,uninstallation,wmic,windows-installer,Go,Uninstallation,Wmic,Windows Installer,您好,我尝试使用GUID卸载一个产品,当我在命令提示符下直接执行它时,它工作正常。但是,当我尝试使用Golang执行它时,我收到一条错误消息 我的代码: // Powershell_Command package main import ( "fmt" "os/exec" ) func main() { out, err := exec.Command("cmd","/C","wmic","product","where","IdentifyingNumber=\"{

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

输出::

提前感谢

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

但有几件事需要注意:

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

     out, err := exec.Command("wmic.exe", "product", "where",
          `IdentifyingNumber="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"`,
          "call", "uninstall").Output()
    
    (注意使用反引号生成“原始”字符串,这有助于防止“反斜杠”

  • 您无法获取正在运行的程序的标准错误流

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

    另一点:除非您的Go程序是“GUI”子系统(即,不打算在控制台窗口中运行),否则通常更明智的做法是让生成的程序将其输出的内容输出到与其主机进程相同的媒体。为此,您只需将其标准流连接到进程的标准流:

    cmd := exec.Command("foo.exe", ...)
    cmd.Stdin = os.Stdin
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    err := cmd.Run()
    
  • 您不需要
    wmic
    也可以直接调用
    msiexec

    msiexec.exe /uninstall {GUID}
    
    原因是
    wmic
    最终会调用
    msiexec
    ,因为除了调用Windows应用程序的卸载程序外,没有其他方法卸载Windows应用程序

  • (这个问题大部分与围棋无关。)

    但有几件事需要注意:

  • 不要调用
    cmd.exe
    :它是用来运行脚本的,你不是在运行脚本,只是在调用一个程序。所以你的调用就变成了

     out, err := exec.Command("wmic.exe", "product", "where",
          `IdentifyingNumber="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"`,
          "call", "uninstall").Output()
    
    (注意使用反引号生成“原始”字符串,这有助于防止“反斜杠”

  • 您无法获取正在运行的程序的标准错误流

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

    另一点:除非您的Go程序是“GUI”子系统(即,不打算在控制台窗口中运行),否则通常更明智的做法是让生成的程序将其输出的内容输出到与其主机进程相同的媒体。为此,您只需将其标准流连接到进程的标准流:

    cmd := exec.Command("foo.exe", ...)
    cmd.Stdin = os.Stdin
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    err := cmd.Run()
    
  • 您不需要
    wmic
    也可以直接调用
    msiexec

    msiexec.exe /uninstall {GUID}
    
    原因是
    wmic
    最终会调用
    msiexec
    ,因为除了调用Windows应用程序的卸载程序外,没有其他方法卸载Windows应用程序


  • 此问题与powershell的关系如何?此问题与powershell的关系如何?