Golang Go语言编译的exe程序双击运行的环境问题

发布于 1周前 作者 htzhanglong 来自 Go语言

最近遇到一类奇怪的问题,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 双击运行的权限和环境继承有关,右键选择管理员运行就不会有问题,但是按理普通用户也是都在的呀

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


Golang Go语言编译的exe程序双击运行的环境问题

更多关于Golang Go语言编译的exe程序双击运行的环境问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

14 回复

至少贴一下 exec 代码块吧……

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

参考↓

cmd := exec.Command(“pwd”)
cmd.Dir = "…"
cmd.Env = append(cmd.Environ(), “POSIXLY_CORRECT=1”)
out, err := cmd.Output()

更多关于Golang Go语言编译的exe程序双击运行的环境问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


如果你要加入系统环境,用 os.Environ()

#1
wmic 小东西:
<br> wmicCmd := exec.Command("C:/Windows/System32/wbem/wmic", args...)<br>
我电脑上怎么打开都正常

wails 调用的
wails --其它库的函数–>
<br> if runtime.GOOS == "windows" {<br> var args = []string{<br> "Compress-Archive",<br> "-Path",<br> fmt.Sprintf("\"%s/*.xlsx\",\"%s/*.pdf\"", basePrefix, basePrefix),<br> "-DestinationPath",<br> outputPrefix + ".result.zip",<br> "-Force",<br> }<br> log.Println(strings.Join(args, " "))<br> simpleUtil.CheckErr(<a target="_blank" href="http://sge.Run" rel="nofollow noopener">sge.Run</a>("powershell", args...))<br>

#2 我试试这个,谢谢~

#2
经测试,os.Environ()无法解决问题,我上面展示的"PATH"就是通过 os.Getenv(“PATH”)获取的,跟 os.Environ()内一致,是启动这个软件的时候它本身的系统环境就比较奇怪

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

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

解决办法:不要调用命令行。都写 go 了还调命令行读数据不觉得有点 low 么

#6 不太明白“调命令行读数据”是指什么?
我这边一个是直接用 windows 系统的 WMIC 提取本机硬件信息 https://learn.microsoft.com/zh-cn/windows/win32/wmisdk/wmic ,这个我自己还没找到相关的 go 包可以直接用
另一个是调用 powershell Compress-Archive 进行 zip 压缩,没有去找是否有直接的 go 包

另外调用命令行是很常见的需求,不好规避吧

另外,又用 C 编译试了下,同样桌面/terminal 通过 explorer 进入文件夹双击 PATH 环境正常,直接进文件夹后双击 PATH 异常

这个问题感觉是 Windows 老疑难杂症了,具体原因不清楚,我现在是 Windows terminal 使用 powershell 正常,但是 vscode 里配置的 powershell 就不对,使用的 PATH 是“系统环境变量”中的,而不是我的“用户环境变量”。以前也出过这个问题,不知道咋好的。正好我这也有 KB5034848 ,更新下试试

巧了,刚搞着 wails ,坑很多。比如在 mac 下双击启动 build 出来的包调用 runtime getclipboard ,会出现中文乱码,开发或命令启动不会。mac 下 build 后 env.getwd 无法获取当前目录,开发可以。。。

#9 很多次遇到 windows 表现奇怪,进系统更新就发现有要更新的东西(等待更新,没有启动更新),然后更新重启后就正常了,我都怀疑是 MS 故意的,跟具体哪个 KB 也没关系,有更新之前也是一直正常的

中文乱码可能是编码问题吧,都弄成 UTF8 ,或者自己手动加个解码试试
wails dev 和 wails build 差异有时候很大,都有 dev 可以编译,build 报错(我遇到过 TS 的一些类型错误,和 wails 本身 runtime 库没有 import(dev 不 import 也没事)的问题),这次的问题凸显出 dev 是在 terminal 里面启动,build 是生成后你自己各种启动方式,还有获取当前目录应该是 go 后端 os.Getwd()获取呀

#7 well, look harder
https://github.com/yusufpapurcu/wmi
另外 zip 都要调命令行过份了

#12 谢谢大佬~

关于Golang编译的exe程序双击运行的环境问题,以下是一些专业的解答和建议:

首先,确保你的系统上已经安装了Go语言环境,并且已经正确配置了环境变量。这是运行Go语言编译的exe文件的基础。

其次,双击运行exe文件时,需要确保该文件是在与你的操作系统和架构相匹配的环境下编译的。例如,如果你在Windows 64位系统上编译了一个exe文件,那么它只能在Windows 64位系统上运行。如果尝试在其他操作系统或架构上运行,可能会导致兼容性问题。

此外,还需要注意以下几点:

  1. 依赖关系:如果你的Go程序依赖于某些第三方库或框架,需要确保这些依赖关系在目标系统上已经得到满足。否则,即使exe文件能够运行,也可能会因为缺少依赖而出错。
  2. 路径问题:双击运行exe文件时,需要确保该文件所在的路径已经被系统包含在PATH环境变量中,或者你需要直接导航到该文件所在的目录再双击运行。
  3. 权限问题:在某些情况下,可能需要管理员权限才能运行某些exe文件。如果遇到权限问题,可以尝试以管理员身份运行该文件。

总之,运行Golang编译的exe程序需要注意环境配置、依赖关系、路径和权限等问题。如果遇到问题,可以检查这些方面是否配置正确。

回到顶部