为了账号安全,请及时绑定邮箱和手机立即绑定

通过 GUID 卸载应用程序

通过 GUID 卸载应用程序

Go
白衣非少年 2021-12-07 10:16:38
我尝试使用 GUID 卸载产品,当我在命令提示符下直接执行它时效果很好,但是,当我尝试使用 Golang 执行它时收到错误消息我的代码:// Powershell_Commandpackage mainimport (    "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 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

(这个问题在很大程度上与 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 应用程序。


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信