您好我尝试使用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
出::
先谢谢
答案 0 :(得分:2)
(这个问题大部分与Go无关。)
但有几点需要注意:
不要调用cmd.exe
:它是用于运行脚本,而不是运行脚本而只是调用程序。所以你的电话就变成了
out, err := exec.Command("wmic.exe", "product", "where",
`IdentifyingNumber="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"`,
"call", "uninstall").Output()
(注意使用反引号来制作一个“原始”字符串 - 这有助于防止“反斜杠”。
您没有抓住正在运行的程序的标准错误流。
考虑使用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()
您也不需要wmic
- 只需直接呼叫msiexec
:
msiexec.exe /uninstall {GUID}
原因是wmic
最终会调用msiexec
,因为除了调用其卸载程序之外没有其他方法可以卸载Windows应用程序。