操作系统用户名为中文时,使用 nodejs 的 exec 命令执行指令失败

2021-10-23 07:08:53 +08:00
 yocoso

开发的软件遇到个问题,请教一下如何解决?

通过 nodejs 执行命令,需要执行的程序 compress.exe 是在用户文件夹下,而用户名是中文,这时候会报错,说 the system cannot find the path specified

请问有何办法绕过这个中文用户吗?

实验过,只有系统用户名是中文会报错,如果是文件名中文并不会报错。

C:\Users\虎鲸>node test.js
Error: Command failed: C:\Users\虎鲸\AppData\Local\Studio\app-1.0.3\resources\app\ext\fbximporter\fbx2cal3d.exe --log C:\Users\虎鲸\Documents\IMVU Studio Projects\_fbx\_logs\THE_tshirt_Square.fbx.data.txt -f C:\Users\虎鲸\Documents\Studio Projects/_fbx/current.fbx --list-all
The system cannot find the path specified.
    at ChildProcess.exithandler (child_process.js:383:12)
    at ChildProcess.emit (events.js:400:28)
    at maybeClose (internal/child_process.js:1058:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:293:5) {
  killed: false,
  code: 1,
  signal: null,
  cmd: 'C:\\Users\\虎鲸\\AppData\\Local\\Studio\\app-1.0.3\\resources\\app\\ext\\fbximporter\\fbx2cal3d.exe --log C:\\Users\\虎鲸\\Documents\\Studio Projects\\_fbx\\_logs\\THE_tshirt_Square.fbx.data.txt -f C:\\Users\\虎鲸\\Documents\\Studio Projects/_fbx/current.fbx --list-all'
}
6607 次点击
所在节点    Node.js
17 条回复
pansongya
2021-10-23 07:14:47 +08:00
路径加双引号试试
l4ever
2021-10-23 08:42:49 +08:00
既然知道问题, 就把用户名改回英文
kokutou
2021-10-23 09:06:05 +08:00
中文 Windows 里 虎鲸 是 cp936 编码的
代码里盲猜是 utf-8

试试把整个的 cmd 命令行做个编码转换再运行看看。。。


但是还有一种情况就是勾了 Windows 区域设置里非 Unicode 程序 utf-8 支持后,这个编码会不会产生变化。。
yocoso
2021-10-23 10:03:41 +08:00
@pansongya 谢谢,试过了,还是一样
yocoso
2021-10-23 10:03:59 +08:00
@l4ever 用户的系统名我们没法更改呀
yiXu
2021-10-23 10:09:49 +08:00
@yocoso `Studio Projects` 会不会是多了空格的问题。。。
momocraft
2021-10-23 10:39:00 +08:00
怎么执行的 有正确传递参数 **列表** 吗?
yocoso
2021-10-23 11:18:17 +08:00
@kokutou 谢谢,尝试用 iconv 将 cmd 从 cp936 转换成 utf-8, 结果变成 C:\Users\铏庨哺\ 了,是不是编码弄错了
yocoso
2021-10-23 11:19:09 +08:00
@yiXu 不是,英文的用户名就没问题,韩文的用户名也不行
yocoso
2021-10-23 11:22:19 +08:00
@momocraft 写了一个很简单的 script 来测试,参数没问题,试过其他非中文用户路径,没有问题。

const { exec } = require('child_process');
const cmd = 'C:\\Users\\虎鲸\\AppData\\Local\\IStudio\\app-1.0.3\\resources\\app\\ext\\fbximporter\\fbx2cal3d.exe --log C:\\Users\\虎鲸\\Documents\\Studio Projects\\_fbx\\_logs\\THE_tshirt_Square.fbx.data.txt -f C:\\Users\\虎鲸\\Documents\\Studio Projects/_fbx/current.fbx --list-all';
exec(cmd, (err, stdout, stderr)=>{
if (err) {
console.log(err);
return;
}
console.log(stdout);
});
momocraft
2021-10-23 11:34:35 +08:00
@yocoso 可以试试 child_process.execFile , 这个是程序文件和参数分开传的 也许能避免 exec 命令解析中可能产生的问题
DiamondYuan
2021-10-23 13:02:16 +08:00
options 设置 shell:true 试试看?
kokutou
2021-10-23 16:29:35 +08:00
@yocoso #8
https://stackoverflow.com/questions/20731785/wrong-encoding-when-using-child-process-spawn-or-exec-under-windows
直接切换 cmd 到 65001 再运行。

Google 搜索 child_process cp936 第一个就是答案。
g00001
2021-10-23 16:39:53 +08:00
Node.js 虽然强大,毕竟不是专为 Windows 设计,有时候这种坑是真不少,
用一段 aardio 代码解释一下 Node.js 为什么会有乱码:

import win.ui;
/*DSG{{*/
var winform = win.form(text="Node.js";right=754;bottom=457)
winform.add(
edit={cls="edit";left=21;top=19;right=727;bottom=426;edge=1;multiline=1;z=1}
)
/*}}*/

import nodeJs;
nodeJs.require("iconv-lite");

var testjs = /***
console.log("双方编码一致没乱码:")
console.log(process.argv);

const iconv = require('iconv-lite');
const { exec } = require('child_process');
exec('echo 中文', { encoding: 'binary' }, (err, stdout, stderr) => {
console.log("乱码了:",stdout);
stdout = iconv.decode(Buffer.from(stdout, 'binary'), 'cp936');
console.log("不乱码了:",stdout);
});
***/

var node = nodeJs.exec(testjs,"--log","测试 UTF-8 不会乱码 😀");
for( all,out,err in node.each() ){
winform.edit.print(all);
}

winform.show();
win.loopMessage();
uvwlab
2021-10-23 23:15:39 +08:00
试下 Powershell
yocoso
2021-10-24 06:22:24 +08:00
@kokutou OMG, 好像是这个区域设置的问题,昨天改了设置不知道为什么还是报错,但是今天竟然莫名其妙好了。把这个 check off 之后又抱错了。试了几次,确定是这个设置的原因。感谢感谢!
yocoso
2021-10-24 06:25:44 +08:00
@momocraft 其实原代码中就是用的 execFile ,这里的 example 只是一个测试。

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

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

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

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

© 2021 V2EX