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

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

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

1857 次点击
所在节点    Go 编程语言
13 条回复
kkk9
261 天前
至少贴一下 exec 代码块吧……

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

参考↓

cmd := exec.Command("pwd")
cmd.Dir = ".."
cmd.Env = append(cmd.Environ(), "POSIXLY_CORRECT=1")
out, err := cmd.Output()
kkk9
261 天前
如果你要加入系统环境,用 os.Environ()
jrqlxue
261 天前
@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
261 天前
@kkk9 #2 我试试这个,谢谢~
jrqlxue
261 天前
@kkk9 #2
经测试,os.Environ()无法解决问题,我上面展示的"PATH"就是通过 os.Getenv("PATH")获取的,跟 os.Environ()内一致,是启动这个软件的时候它本身的系统环境就比较奇怪

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

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

另外调用命令行是很常见的需求,不好规避吧
jrqlxue
261 天前
另外,又用 C 编译试了下,同样桌面/terminal 通过 explorer 进入文件夹双击 PATH 环境正常,直接进文件夹后双击 PATH 异常
xianzhe
261 天前
这个问题感觉是 Windows 老疑难杂症了,具体原因不清楚,我现在是 Windows terminal 使用 powershell 正常,但是 vscode 里配置的 powershell 就不对,使用的 PATH 是“系统环境变量”中的,而不是我的“用户环境变量”。以前也出过这个问题,不知道咋好的。正好我这也有 KB5034848 ,更新下试试
realJamespond
261 天前
巧了,刚搞着 wails ,坑很多。比如在 mac 下双击启动 build 出来的包调用 runtime getclipboard ,会出现中文乱码,开发或命令启动不会。mac 下 build 后 env.getwd 无法获取当前目录,开发可以。。。
jrqlxue
261 天前
@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
261 天前
@jrqlxue #7 well, look harder
https://github.com/yusufpapurcu/wmi
另外 zip 都要调命令行过份了
jrqlxue
260 天前
@deorth #12 谢谢大佬~

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

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

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

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

© 2021 V2EX