82 lines
1.8 KiB
Go
82 lines
1.8 KiB
Go
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
|
||
}
|