最近遇到一类奇怪的问题,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 双击运行的权限和环境继承有关,右键选择管理员运行就不会有问题,但是按理普通用户也是都在的呀
大家有没有相关经验分享下?
经过更多测试,发现如下规律:
大概是 explorer 继承了 terminal 的环境吧,最近刚在 V2 学会的用 start 打开东西😂
感觉这个是windows自身的某些特性吧,不过从使用角度,如何解决普通用户打开文件夹后双击运行的环境问题呢?
1
kkk9 261 天前
至少贴一下 exec 代码块吧……
我猜测只是你 exec 的时候没有加入环境 env 参考↓ cmd := exec.Command("pwd") cmd.Dir = ".." cmd.Env = append(cmd.Environ(), "POSIXLY_CORRECT=1") out, err := cmd.Output() |
2
kkk9 261 天前
如果你要加入系统环境,用 os.Environ()
|
3
jrqlxue OP @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...)) ``` |
5
jrqlxue OP @kkk9 #2
经测试,os.Environ()无法解决问题,我上面展示的"PATH"就是通过 os.Getenv("PATH")获取的,跟 os.Environ()内一致,是启动这个软件的时候它本身的系统环境就比较奇怪 经过更多测试,发现如下规律: 1. 快捷方式发送到桌面或者直接拷贝到桌面,桌面双击运行 PATH 正常 2. 从 terminal 用 explorer 命令打开的文件夹里双击正常 3. 从 terminal 用 start 命令打开的文件夹里双击不行 4. 点击任务栏打开文件资源管理器/通过桌面的文件夹进去的双击不行 大概是 explorer 继承了 terminal 的环境吧,最近刚在 V2 学会的用 start 打开东西😂 |
6
deorth 261 天前 via Android
解决办法:不要调用命令行。都写 go 了还调命令行读数据不觉得有点 low 么
|
7
jrqlxue OP @deorth #6 不太明白“调命令行读数据”是指什么?
我这边一个是直接用 windows 系统的 WMIC 提取本机硬件信息 https://learn.microsoft.com/zh-cn/windows/win32/wmisdk/wmic ,这个我自己还没找到相关的 go 包可以直接用 另一个是调用 powershell Compress-Archive 进行 zip 压缩,没有去找是否有直接的 go 包 另外调用命令行是很常见的需求,不好规避吧 |
8
jrqlxue OP 另外,又用 C 编译试了下,同样桌面/terminal 通过 explorer 进入文件夹双击 PATH 环境正常,直接进文件夹后双击 PATH 异常
|
9
xianzhe 261 天前
这个问题感觉是 Windows 老疑难杂症了,具体原因不清楚,我现在是 Windows terminal 使用 powershell 正常,但是 vscode 里配置的 powershell 就不对,使用的 PATH 是“系统环境变量”中的,而不是我的“用户环境变量”。以前也出过这个问题,不知道咋好的。正好我这也有 KB5034848 ,更新下试试
|
10
realJamespond 261 天前
巧了,刚搞着 wails ,坑很多。比如在 mac 下双击启动 build 出来的包调用 runtime getclipboard ,会出现中文乱码,开发或命令启动不会。mac 下 build 后 env.getwd 无法获取当前目录,开发可以。。。
|
11
jrqlxue OP @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()获取呀 |
12
deorth 261 天前 via Android 1
|