V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yocoso
V2EX  ›  Node.js

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

  •  1
     
  •   yocoso · 2021-10-23 07:08:53 +08:00 · 6634 次点击
    这是一个创建于 1135 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    通过 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'
    }
    
    17 条回复    2021-10-24 06:25:44 +08:00
    pansongya
        1
    pansongya  
       2021-10-23 07:14:47 +08:00 via Android
    路径加双引号试试
    l4ever
        2
    l4ever  
       2021-10-23 08:42:49 +08:00   ❤️ 1
    既然知道问题, 就把用户名改回英文
    kokutou
        3
    kokutou  
       2021-10-23 09:06:05 +08:00
    中文 Windows 里 虎鲸 是 cp936 编码的
    代码里盲猜是 utf-8

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


    但是还有一种情况就是勾了 Windows 区域设置里非 Unicode 程序 utf-8 支持后,这个编码会不会产生变化。。
    yocoso
        4
    yocoso  
    OP
       2021-10-23 10:03:41 +08:00
    @pansongya 谢谢,试过了,还是一样
    yocoso
        5
    yocoso  
    OP
       2021-10-23 10:03:59 +08:00
    @l4ever 用户的系统名我们没法更改呀
    yiXu
        6
    yiXu  
       2021-10-23 10:09:49 +08:00
    @yocoso `Studio Projects` 会不会是多了空格的问题。。。
    momocraft
        7
    momocraft  
       2021-10-23 10:39:00 +08:00
    怎么执行的 有正确传递参数 **列表** 吗?
    yocoso
        8
    yocoso  
    OP
       2021-10-23 11:18:17 +08:00
    @kokutou 谢谢,尝试用 iconv 将 cmd 从 cp936 转换成 utf-8, 结果变成 C:\Users\铏庨哺\ 了,是不是编码弄错了
    yocoso
        9
    yocoso  
    OP
       2021-10-23 11:19:09 +08:00
    @yiXu 不是,英文的用户名就没问题,韩文的用户名也不行
    yocoso
        10
    yocoso  
    OP
       2021-10-23 11:22:19 +08:00   ❤️ 1
    @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
        11
    momocraft  
       2021-10-23 11:34:35 +08:00
    @yocoso 可以试试 child_process.execFile , 这个是程序文件和参数分开传的 也许能避免 exec 命令解析中可能产生的问题
    DiamondYuan
        12
    DiamondYuan  
       2021-10-23 13:02:16 +08:00 via iPhone
    options 设置 shell:true 试试看?
    kokutou
        13
    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
        14
    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
        15
    uvwlab  
       2021-10-23 23:15:39 +08:00
    试下 Powershell
    yocoso
        16
    yocoso  
    OP
       2021-10-24 06:22:24 +08:00
    @kokutou OMG, 好像是这个区域设置的问题,昨天改了设置不知道为什么还是报错,但是今天竟然莫名其妙好了。把这个 check off 之后又抱错了。试了几次,确定是这个设置的原因。感谢感谢!
    yocoso
        17
    yocoso  
    OP
       2021-10-24 06:25:44 +08:00
    @momocraft 其实原代码中就是用的 execFile ,这里的 example 只是一个测试。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2596 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 03:23 · PVG 11:23 · LAX 19:23 · JFK 22:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.