网络日志

解决win10下child_process.spawn stdout返回值出错的问题

一开始的写法如下,跟网上部分网友的写法类似:


const ping = (ip) => {
    return new Promise((resolve, reject) => {
        console.log(`ping ${ip}...`)
        let child = childProcess.spawn("ping",[ip]);
        let str = "";
        child.stdout.on("data", (data) => {
            str += iconv.decode(data, encodings);
        });
        child.stdout.on("end",() => {
            console.log(`ping ${ip} 已完成!!`)
            return resolve(str);
        });
    });
}

一开始执行有resolve到正常返回值,pkg打包后执行失败,再回去vscode调试也失败,具体有几种情况,忘记具体改了什么出现了,

  1. resolve到ping IP地址 的命令本身,
  2. resolve到''空字符串,data 全程为'',
  3. 如下 spawn EPERM 错误,没有触发 data event//ping 8.134.120.228...//Uncaught Error Error: spawn EPERM ...

从第一种情况分析,发现和在node.exe环境下执行的结果相近

node
Welcome to Node.js v16.15.0.
Type ".help" for more information.
> ping 127.0.0.1
ping 127.0.0.1
     ^^^^^
Uncaught SyntaxError: Unexpected number

第一行把命令返回来了,个人觉得是因为执行环境没有显式给出的原因,看了网上一些相关文章,说显示使用cmd执行命令,于是将spawn改为

let child = childProcess.spawn("cmd",["ping",ip]);

出现状况2,返回的data为空字符串,在cmd 测试下

> cmd ping 127.0.0.1
Microsoft Windows [版本 10.0.19043.1526]
(c) Microsoft Corporation。保留所有权利。

跟直接执行cmd一样的,再换powershell测试,有正确返回值

> powershell ping 127.0.0.1

正在 Ping 127.0.0.1 具有 32 字节的数据:

再将spwan改为

let child = childProcess.spawn("powershell",["ping",ip]);

问题解决。


具体什么原因,我shell不太熟悉,加上公司环境的独特性,我分析不出来。不过先记录下来避免重复踩坑。