我正在编写一个函数,该函数通过将应用程序路径作为参数来运行msi文件。现在,该函数正在返回错误代码,指出该应用程序的路径不是有效的Win32应用程序。此功能适用于.exe文件,但不适用于.msi文件。如何重构使其适用于.msi文件?
func Run(application string) {
cmd := exec.Command(application)
err := cmd.Run()
if err != nil {
log.Fatalf("cmd.Run() failed with %s\n", err)
}
}
答案 0 :(得分:1)
您可以简单地通过Windows的命令行运行它
func main(){
c := exec.Command("cmd", "/C", "msiexec /a \"pathtotheMSIfile\"")
if err := c.Run(); err != nil {
fmt.Println("Error: ", err)
}
}
答案 1 :(得分:0)
如果要运行MSI安装程序,可以致电MsiInstallProductW 直接运行:
package main
import (
"golang.org/x/sys/windows"
"unsafe"
)
func Pointer(s string) (uintptr, error) {
p, e := windows.UTF16PtrFromString(s)
if e != nil {
return uintptr(0), e
}
return uintptr(unsafe.Pointer(p)), nil
}
func InstallProduct(path_s string, cmd_s string) error {
path_p, e := Pointer(path_s)
if e != nil {
return e
}
cmd_p, e := Pointer(cmd_s)
if e != nil {
return e
}
o := windows.NewLazyDLL("msi.dll").NewProc("MsiInstallProductW")
o.Call(path_p, cmd_p)
return nil
}
func main() {
InstallProduct("a.msi", "")
}