一开始的写法如下,跟网上部分网友的写法类似:
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调试也失败,
具体有几种情况,忘记具体改了什么出现了,
- resolve到ping IP地址 的命令本身,
- resolve到''空字符串,data 全程为'',
- 如下 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不太熟悉,加上公司环境的独特性,我分析不出来。
不过先记录下来避免重复踩坑。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。