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

发布于 1周前 作者 eggper 来自 nodejs/Nestjs

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

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

通过 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'
}

18 回复

路径加双引号试试


既然知道问题, 就把用户名改回英文

中文 Windows 里 虎鲸 是 cp936 编码的
代码里盲猜是 utf-8

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


但是还有一种情况就是勾了 Windows 区域设置里非 Unicode 程序 utf-8 支持后,这个编码会不会产生变化。。

谢谢,试过了,还是一样

用户的系统名我们没法更改呀

Studio Projects 会不会是多了空格的问题。。。

怎么执行的 有正确传递参数 列表 吗?

谢谢,尝试用 iconv 将 cmd 从 cp936 转换成 utf-8, 结果变成 C:\Users\铏庨哺\ 了,是不是编码弄错了

不是,英文的用户名就没问题,韩文的用户名也不行

写了一个很简单的 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);
});

可以试试 child_process.execFile , 这个是程序文件和参数分开传的 也许能避免 exec 命令解析中可能产生的问题

options 设置 shell:true 试试看?

#8
https://stackoverflow.com/questions/20731785/wrong-encoding-when-using-child-process-spawn-or-exec-under-windows
直接切换 cmd 到 65001 再运行。

Google 搜索 child_process cp936 第一个就是答案。

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();

试下 Powershell

OMG, 好像是这个区域设置的问题,昨天改了设置不知道为什么还是报错,但是今天竟然莫名其妙好了。把这个 check off 之后又抱错了。试了几次,确定是这个设置的原因。感谢感谢!

其实原代码中就是用的 execFile ,这里的 example 只是一个测试。

在 Node.js 中,当操作系统的用户名为中文时,使用 exec 命令执行指令可能会遇到编码问题,导致命令执行失败。这通常是因为环境变量或命令行工具处理中文时存在编码不匹配的问题。

以下是一些可能的解决方案:

  1. 确保环境变量编码正确: 确保你的 Node.js 应用程序和操作系统环境都使用 UTF-8 编码。你可以通过设置环境变量 NODE_OPTIONS--utf8-all-strings 来强制 Node.js 使用 UTF-8 编码。

  2. 使用 child_process.spawn 替代 execspawn 方法允许你更直接地控制子进程的输入和输出流,并且可能更好地处理编码问题。

    const { spawn } = require('child_process');
    const child = spawn('your-command', ['arg1', 'arg2'], {
        encoding: 'utf8'
    });
    
    child.stdout.on('data', (data) => {
        console.log(`stdout: ${data}`);
    });
    
    child.stderr.on('data', (data) => {
        console.error(`stderr: ${data}`);
    });
    
    child.on('close', (code) => {
        console.log(`child process exited with code ${code}`);
    });
    
  3. 手动处理编码: 如果上述方法无效,你可能需要手动将中文用户名转换为另一种编码,或者在执行命令前对命令字符串进行编码处理。

这些方法可以帮助你解决在 Node.js 中使用中文用户名时 exec 命令执行失败的问题。如果问题仍然存在,建议检查具体的命令和参数,确保它们没有受到编码问题的影响。

回到顶部