68 lines
1.7 KiB
Go
68 lines
1.7 KiB
Go
//go:build windows
|
|
// +build windows
|
|
|
|
package handlers
|
|
|
|
import (
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"strings"
|
|
"syscall"
|
|
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
func hideCmdWindow(cmd *exec.Cmd) {
|
|
cmd.SysProcAttr = &syscall.SysProcAttr{
|
|
HideWindow: true,
|
|
CreationFlags: windows.CREATE_NO_WINDOW,
|
|
}
|
|
}
|
|
|
|
func startSilentProcess(command string, args []string, cwd string, hideWindow bool) error {
|
|
ext := strings.ToLower(filepath.Ext(command))
|
|
|
|
var cmd *exec.Cmd
|
|
switch ext {
|
|
case ".bat", ".cmd":
|
|
cmd = exec.Command("cmd.exe", append([]string{"/c", command}, args...)...)
|
|
case ".ps1":
|
|
cmd = exec.Command("powershell.exe", append([]string{"-ExecutionPolicy", "Bypass", "-NoProfile", "-File", command}, args...)...)
|
|
default:
|
|
cmd = exec.Command(command, args...)
|
|
}
|
|
|
|
if cwd != "" {
|
|
cmd.Dir = cwd
|
|
}
|
|
|
|
if hideWindow {
|
|
attr := &syscall.SysProcAttr{HideWindow: true, CreationFlags: windows.CREATE_NO_WINDOW}
|
|
nullFile, err := os.OpenFile(os.DevNull, os.O_RDWR, 0)
|
|
if err == nil {
|
|
cmd.Stdin = nullFile
|
|
cmd.Stdout = nullFile
|
|
cmd.Stderr = nullFile
|
|
}
|
|
|
|
cmd.SysProcAttr = attr
|
|
return cmd.Start()
|
|
}
|
|
|
|
switch ext {
|
|
case ".ps1":
|
|
psArgs := append([]string{"-ExecutionPolicy", "Bypass", "-NoProfile", "-File", command}, args...)
|
|
cmd = exec.Command("cmd.exe", append([]string{"/c", "start", "", "powershell.exe"}, psArgs...)...)
|
|
case ".bat", ".cmd":
|
|
cmd = exec.Command("cmd.exe", append([]string{"/c", "start", "", "cmd.exe", "/c", command}, args...)...)
|
|
default:
|
|
cmd = exec.Command("cmd.exe", append([]string{"/c", "start", "", command}, args...)...)
|
|
}
|
|
if cwd != "" {
|
|
cmd.Dir = cwd
|
|
}
|
|
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: false}
|
|
return cmd.Start()
|
|
}
|