go 编译的 exe 程序双击运行的环境问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
jrqlxue

go 编译的 exe 程序双击运行的环境问题

  •  1
     
  •   jrqlxue 2024 年 3 月 7 日 2813 次点击
    这是一个创建于 780 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近遇到一类奇怪的问题,wails 编译出来的 exe 通过双击运行会没有 powershell 的环境,然后 exec 调用的 powershell 运行命令会出类似下面的错误:

    time=2024-03-07T09:58:16.758+08:00 level=INFO msg="exec: \"powershell\": executable file not found in %PATH% []" 

    还有一个小程序通过 wmic 提取硬件信息,结果在客户那边跑不动,排查发现也是 PATH 环境问题,最后是改成运行C:/Windows/System32/wbem/wmic解决的。

    排查发现常规双击的 PATH 环境只有 Vim/vim90/GvimExt64 ( vim 还在 PATH 里面也挺奇怪的)

    PATH="C:\\Program Files\\Vim\\vim90\\\\GvimExt64;C:\\Program Files\\Vim\\vim90\\\\GvimExt64;C:\\Program Files\\Vim\\vim90\\\\GvimExt64;" 

    我怀疑跟 windows 双击运行的权限和环境继承有关,右键选择管理员运行就不会有问题,但是按理普通用户也是都在的呀

    大家有没有相关经验分享下?

    第 1 条附言    2024 年 3 月 7 日

    经过更多测试,发现如下规律:

    1. 快捷方式发送到桌面或者直接拷贝到桌面,桌面双击运行 PATH 正常
    2. 从 terminal 用 explorer 命令打开的文件夹里双击正常
    3. 从 terminal 用 start 命令打开文件夹里双击不行
    4. 点击任务栏打开文件资源管理器/通过桌面的文件夹进去的双击不行

    大概是 explorer 继承了 terminal 的环境吧,最近刚在 V2 学会的用 start 打开东西

    感觉这个是windows自身的某些特性吧,不过从使用角度,如何解决普通用户打开文件夹后双击运行的环境问题呢?

    第 2 条附言    2024 年 3 月 7 日
    问题已解决:
    我进行了 windows 更新( 2024-适用于 Windows 11 Version 23H2 的 02 累积更新,适合基于 x64 的系统 (KB5034848))
    重启后,表现正常了
    13 条回复    2024-03-08 08:34:40 +08:00
    kkk9
        1
    kkk9  
       2024 年 3 月 7 日
    至少贴一下 exec 代码块吧……

    我猜测只是你 exec 的时候没有加入环境 env

    参考↓

    cmd := exec.Command("pwd")
    cmd.Dir = ".."
    cmd.Env = append(cmd.Environ(), "POSIXLY_CORRECT=1")
    out, err := cmd.Output()
    kkk9
        2
    kkk9  
       2024 年 3 月 7 日
    如果你要加入系统环境,用 os.Environ()
    jrqlxue
        3
    jrqlxue  
    OP
       2024 年 3 月 7 日
    @kkk9 #1
    wmic 小东西:
    ```
    wmicCmd := exec.Command("C:/Windows/System32/wbem/wmic", args...)
    ```
    我电脑上怎么打开都正常

    wails 调用的
    wails --其它库的函数-->
    ```
    if runtime.GOOS == "windows" {
    var args = []string{
    "Compress-Archive",
    "-Path",
    fmt.Sprintf("\"%s/*.xlsx\",\"%s/*.pdf\"", basePrefix, basePrefix),
    "-DestinationPath",
    outputPrefix + ".result.zip",
    "-Force",
    }
    log.Println(strings.Join(args, " "))
    simpleUtil.CheckErr(sge.Run("powershell", args...))
    ```
    jrqlxue
        4
    jrqlxue  
    OP
       2024 年 3 月 7 日
    @kkk9 #2 我试试这个,谢谢~
    jrqlxue
        5
    jrqlxue  
    OP
       2024 年 3 月 7 日
    @kkk9 #2
    经测试,os.Environ()无法解决问题,我上面展示的"PATH"就是通过 os.Getenv("PATH")获取的,跟 os.Environ()内一致,是启动这个软件的时候它本身的系统环境就比较奇怪

    经过更多测试,发现如下规律:
    1. 快捷方式发送到桌面或者直接拷贝到桌面,桌面双击运行 PATH 正常
    2. 从 terminal 用 explorer 命令打开的文件夹里双击正常
    3. 从 terminal 用 start 命令打开的文件夹里双击不行
    4. 点击任务栏打开文件资源管理器/通过桌面的文件夹进去的双击不行

    大概是 explorer 继承了 terminal 的环境吧,最近刚在 V2 学会的用 start 打开东西
    deorth
        6
    deorth      2024 年 3 月 7 日 via Android
    解决办法:不要调用命令行。都写 go 了还调命令行读数据不觉得有点 low 么
    jrqlxue
        7
    jrqlxue  
    OP
       2024 年 3 月 7 日
    @deorth #6 不太明白“调命令行读数据”是指什么?
    我这边一个是直接用 windows 系统的 WMIC 提取本机硬件信息 https://learn.microsoft.com/zh-cn/windows/win32/wmisdk/wmic ,这个我自己还没找到相关的 go 包可以直接用
    另一个是调用 powershell Compress-Archive 进行 zip 压缩,没有去找是否有直接的 go 包

    另外调用命令行是很常见的需求,不好规避吧
    jrqlxue
        8
    jrqlxue  
    OP
       2024 年 3 月 7 日
    另外,又用 C 编译试了下,同样桌面/terminal 通过 explorer 进入文件夹双击 PATH 环境正常,直接进文件夹后双击 PATH 异常
    xianzhe
        9
    xianzhe  
       2024 年 3 月 7 日
    这个问题感觉是 Windows 老疑难杂症了,具体原因不清楚,我现在是 Windows terminal 使用 powershell 正常,但是 vscode 里配置的 powershell 就不对,使用的 PATH 是“系统环境变量”中的,而不是我的“用户环境变量”。以前也出过这个问题,不知道咋好的。正好我这也有 KB5034848 ,更新下试试
    realJamespond
        10
    realJamespond  
       2024 年 3 月 7 日
    巧了,刚搞着 wails ,坑很多。比如在 mac 下双击启动 build 出来的包调用 runtime getclipboard ,会出现中文乱码,开发或命令启动不会。mac 下 build 后 env.getwd 无法获取当前目录,开发可以。。。
    jrqlxue
        11
    jrqlxue  
    OP
       2024 年 3 月 7 日
    @xianzhe #9 很多次遇到 windows 表现奇怪,进系统更新就发现有要更新的东西(等待更新,没有启动更新),然后更新重启后就正常了,我都怀疑是 MS 故意的,跟具体哪个 KB 也没关系,有更新之前也是一直正常的

    @realJamespond 中文乱码可能是编码问题吧,都弄成 UTF8 ,或者自己手动加个解码试试
    wails dev 和 wails build 差异有时候很大,都有 dev 可以编译,build 报错(我遇到过 TS 的一些类型错误,和 wails 本身 runtime 库没有 import(dev 不 import 也没事)的问题),这次的问题凸显出 dev 是在 terminal 里面启动,build 是生成后你自己各种启动方式,还有获取当前目录应该是 go 后端 os.Getwd()获取呀
    deorth
        12
    deorth  
       2024 年 3 月 7 日 via Android   1
    @jrqlxue #7 well, look harder
    https://github.com/yusufpapurcu/wmi
    另外 zip 都要调命令行过份了
    jrqlxue
        13
    jrqlxue  
    OP
       2024 年 3 月 8 日
    @deorth #12 谢谢大佬~
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2728 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 06:31 PVG 14:31 LAX 23:31 JFK 02:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86