如何使用golang运行.msi文件?

时间:2019-06-26 14:33:36

标签: go

我正在编写一个函数,该函数通过将应用程序路径作为参数来运行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)
    }
}

2 个答案:

答案 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", "")
}