Go 按GUID卸载应用程序
您好,我尝试使用GUID卸载一个产品,当我在命令提示符下直接执行它时,它工作正常。但是,当我尝试使用Golang执行它时,我收到一条错误消息 我的代码: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=\"{
// 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的关系如何?