//go:build windows package uac import ( "b612.me/wincmd" "strings" ) func RunAsUacSimple(fpath string, cmdArgs string, workDir string, showWindow bool) error { intShow := 0 if showWindow { intShow = 1 } return wincmd.StartProcess(fpath, cmdArgs, workDir, true, intShow) } func RunAsUac(cmdLine, workDir string, showWindow bool) error { intShow := 0 if showWindow { intShow = 1 } fpath, args := getPathArgsFromString(cmdLine) return wincmd.StartProcess(fpath, strings.Join(args, " "), workDir, true, intShow) } func getPathArgsFromString(cmdLine string) (string, []string) { var fpath string var cmdArgs []string var markStart rune = -1 var tmp []rune var lastRune rune cmdLine = strings.TrimSpace(cmdLine) for k, v := range cmdLine { if v == ' ' || v == '"' || v == '\'' { if k == 0 { markStart = v continue } if markStart == v && v == lastRune { continue } if lastRune != '\\' { lastRune = v if 0 == markStart { markStart = v continue } else if markStart == v || markStart == -1 { markStart = 0 if v == ' ' { markStart = v } if fpath == "" { fpath = string(tmp) } else { cmdArgs = append(cmdArgs, string(tmp)) } tmp = []rune{} continue } } } lastRune = v tmp = append(tmp, v) } if len(tmp) != 0 { if fpath == "" { fpath = string(tmp) } else { cmdArgs = append(cmdArgs, string(tmp)) } } return fpath, cmdArgs }