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

2024-03-07 10:45:19 +08:00
 jrqlxue

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

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

2029 次点击
所在节点    Go 编程语言
13 条回复
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
2024-03-07 10:52:54 +08:00
如果你要加入系统环境,用 os.Environ()
jrqlxue
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
2024-03-07 11:02:14 +08:00
@kkk9 #2 我试试这个,谢谢~
jrqlxue
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
2024-03-07 12:35:08 +08:00
解决办法:不要调用命令行。都写 go 了还调命令行读数据不觉得有点 low 么
jrqlxue
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
2024-03-07 14:16:52 +08:00
另外,又用 C 编译试了下,同样桌面/terminal 通过 explorer 进入文件夹双击 PATH 环境正常,直接进文件夹后双击 PATH 异常
xianzhe
2024-03-07 15:05:01 +08:00
这个问题感觉是 Windows 老疑难杂症了,具体原因不清楚,我现在是 Windows terminal 使用 powershell 正常,但是 vscode 里配置的 powershell 就不对,使用的 PATH 是“系统环境变量”中的,而不是我的“用户环境变量”。以前也出过这个问题,不知道咋好的。正好我这也有 KB5034848 ,更新下试试
realJamespond
2024-03-07 16:05:26 +08:00
巧了,刚搞着 wails ,坑很多。比如在 mac 下双击启动 build 出来的包调用 runtime getclipboard ,会出现中文乱码,开发或命令启动不会。mac 下 build 后 env.getwd 无法获取当前目录,开发可以。。。
jrqlxue
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
2024-03-07 18:18:10 +08:00
@jrqlxue #7 well, look harder
https://github.com/yusufpapurcu/wmi
另外 zip 都要调命令行过份了
jrqlxue
2024-03-08 08:34:40 +08:00
@deorth #12 谢谢大佬~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1021360

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX