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 · 262 天前 · 1859 次点击
    这是一个创建于 262 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近遇到一类奇怪的问题,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 条附言  ·  262 天前

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

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

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

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

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

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

    参考↓

    cmd := exec.Command("pwd")
    cmd.Dir = ".."
    cmd.Env = append(cmd.Environ(), "POSIXLY_CORRECT=1")
    out, err := cmd.Output()
    kkk9
        2
    kkk9  
       262 天前
    如果你要加入系统环境,用 os.Environ()
    jrqlxue
        3
    jrqlxue  
    OP
       262 天前
    @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
       262 天前
    @kkk9 #2 我试试这个,谢谢~
    jrqlxue
        5
    jrqlxue  
    OP
       262 天前
    @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  
       262 天前 via Android
    解决办法:不要调用命令行。都写 go 了还调命令行读数据不觉得有点 low 么
    jrqlxue
        7
    jrqlxue  
    OP
       262 天前
    @deorth #6 不太明白“调命令行读数据”是指什么?
    我这边一个是直接用 windows 系统的 WMIC 提取本机硬件信息 https://learn.microsoft.com/zh-cn/windows/win32/wmisdk/wmic ,这个我自己还没找到相关的 go 包可以直接用
    另一个是调用 powershell Compress-Archive 进行 zip 压缩,没有去找是否有直接的 go 包

    另外调用命令行是很常见的需求,不好规避吧
    jrqlxue
        8
    jrqlxue  
    OP
       262 天前
    另外,又用 C 编译试了下,同样桌面/terminal 通过 explorer 进入文件夹双击 PATH 环境正常,直接进文件夹后双击 PATH 异常
    xianzhe
        9
    xianzhe  
       262 天前
    这个问题感觉是 Windows 老疑难杂症了,具体原因不清楚,我现在是 Windows terminal 使用 powershell 正常,但是 vscode 里配置的 powershell 就不对,使用的 PATH 是“系统环境变量”中的,而不是我的“用户环境变量”。以前也出过这个问题,不知道咋好的。正好我这也有 KB5034848 ,更新下试试
    realJamespond
        10
    realJamespond  
       262 天前
    巧了,刚搞着 wails ,坑很多。比如在 mac 下双击启动 build 出来的包调用 runtime getclipboard ,会出现中文乱码,开发或命令启动不会。mac 下 build 后 env.getwd 无法获取当前目录,开发可以。。。
    jrqlxue
        11
    jrqlxue  
    OP
       262 天前
    @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  
       262 天前 via Android   ❤️ 1
    @jrqlxue #7 well, look harder
    https://github.com/yusufpapurcu/wmi
    另外 zip 都要调命令行过份了
    jrqlxue
        13
    jrqlxue  
    OP
       261 天前
    @deorth #12 谢谢大佬~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1394 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:11 · PVG 01:11 · LAX 09:11 · JFK 12:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.