V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
jrqlxue
V2EX  ›  Go 编程语言

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

  •  1
     
  •   jrqlxue · 2024-03-07 10:45:19 +08:00 · 2024 次点击
    这是一个创建于 369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近遇到一类奇怪的问题,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-03-07 11:42:02 +08:00

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

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

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

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

    第 2 条附言  ·  2024-03-07 14:31:48 +08:00
    问题已解决:
    我进行了 windows 更新( 2024-适用于 Windows 11 Version 23H2 的 02 累积更新,适合基于 x64 的系统 (KB5034848))
    重启后,表现正常了
    13 条回复    2024-03-08 08:34:40 +08:00
    kkk9
        1
    kkk9  
       2024-03-07 10:51:21 +08:00
    至少贴一下 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-03-07 10:52:54 +08:00
    如果你要加入系统环境,用 os.Environ()
    jrqlxue
        3
    jrqlxue  
    OP
       2024-03-07 11:01:24 +08:00
    @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-03-07 11:02:14 +08:00
    @kkk9 #2 我试试这个,谢谢~
    jrqlxue
        5
    jrqlxue  
    OP
       2024-03-07 11:39:04 +08:00
    @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-03-07 12:35:08 +08:00 via Android
    解决办法:不要调用命令行。都写 go 了还调命令行读数据不觉得有点 low 么
    jrqlxue
        7
    jrqlxue  
    OP
       2024-03-07 14:13:53 +08:00
    @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-03-07 14:16:52 +08:00
    另外,又用 C 编译试了下,同样桌面/terminal 通过 explorer 进入文件夹双击 PATH 环境正常,直接进文件夹后双击 PATH 异常
    xianzhe
        9
    xianzhe  
       2024-03-07 15:05:01 +08:00
    这个问题感觉是 Windows 老疑难杂症了,具体原因不清楚,我现在是 Windows terminal 使用 powershell 正常,但是 vscode 里配置的 powershell 就不对,使用的 PATH 是“系统环境变量”中的,而不是我的“用户环境变量”。以前也出过这个问题,不知道咋好的。正好我这也有 KB5034848 ,更新下试试
    realJamespond
        10
    realJamespond  
       2024-03-07 16:05:26 +08:00
    巧了,刚搞着 wails ,坑很多。比如在 mac 下双击启动 build 出来的包调用 runtime getclipboard ,会出现中文乱码,开发或命令启动不会。mac 下 build 后 env.getwd 无法获取当前目录,开发可以。。。
    jrqlxue
        11
    jrqlxue  
    OP
       2024-03-07 16:23:41 +08:00
    @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-03-07 18:18:10 +08:00 via Android   ❤️ 1
    @jrqlxue #7 well, look harder
    https://github.com/yusufpapurcu/wmi
    另外 zip 都要调命令行过份了
    jrqlxue
        13
    jrqlxue  
    OP
       2024-03-08 08:34:40 +08:00
    @deorth #12 谢谢大佬~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1024 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:42 · PVG 04:42 · LAX 13:42 · JFK 16:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.