解决win10下child_process.spawn|解决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 字节的数据:

【解决win10下child_process.spawn|解决win10下child_process.spawn stdout返回值出错的问题】再将spwan改为
let child = childProcess.spawn("powershell",["ping",ip]);

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

    推荐阅读