package main import ( "encoding/json" "fmt" "log" "net/url" "os" "os/exec" "path/filepath" "strings" ) // ConfigPath 是 launcher 和前端约定的配置文件路径(用户目录下) const ConfigPath = "%APPDATA%\\cards_web\\launcher_config.json" func main() { // 解析命令行参数:kfzgs://launch?dir=C%3A%5CverifyTool if len(os.Args) < 2 { log.Fatal("缺少参数,请通过 kfzgs:// 协议调用") } rawURL := os.Args[1] // 去掉协议头 if !strings.HasPrefix(rawURL, "kfzgs://") { log.Fatalf("不识别的协议: %s", rawURL) } // 解析 URL parsed, err := url.Parse(rawURL) if err != nil { log.Fatalf("解析 URL 失败: %v", err) } // 从 query 参数读取 dir dir := parsed.Query().Get("dir") if dir == "" { // 如果 URL 中没有 dir 参数,尝试从本地配置文件读取 dir = readConfigDir() } if dir == "" { log.Fatal("未找到程序所在路径,请先在前端页面配置") } // 组装目标 exe 路径 exePath := filepath.Join(dir, "kfz-goods-pricing.exe") // 检查文件是否存在 if _, err := os.Stat(exePath); os.IsNotExist(err) { log.Fatalf("程序不存在: %s", exePath) } // 启动目标 exe(不等待退出) cmd := exec.Command(exePath) cmd.Dir = dir // 把输出打印到日志,方便调试 cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Start(); err != nil { log.Fatalf("启动失败: %v", err) } fmt.Printf("已启动: %s (PID: %d)\n", exePath, cmd.Process.Pid) } // readConfigDir 读取本地配置文件中的 dir 路径 func readConfigDir() string { configPath := os.ExpandEnv(ConfigPath) data, err := os.ReadFile(configPath) if err != nil { return "" } var cfg struct { Dir string `json:"dir"` } if err := json.Unmarshal(data, &cfg); err != nil { return "" } return cfg.Dir }