在 NodeJS 上生成(Windows Server 2012)

xdyibdwo  于 2022-12-27  发布在  Windows
关注(0)|答案(5)|浏览(239)

当我通过节点运行此命令时:

var spawn = require('child_process').spawn;

ls = spawn('ls', ['C:\\Users']);

ls.on('error', function (err) {
  console.log('ls error', err);
});

ls.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
});

ls.stderr.on('data', function (data) {
    console.log('stderr: ' + data);
});

ls.on('close', function (code) {
    console.log('child process exited with code ' + code);
});

出现以下错误:

ls error { [Error: spawn ENOENT] code: 'ENOENT', errno: 'ENOENT', syscall: 'spawn' }
child process exited with code -1

在Windows Server 2012上。有什么想法吗?

yebdmbv4

yebdmbv41#

正如badsyntax所指出的,只要你没有创建别名,ls在windows上就不存在,你将使用'dir',区别在于dir不是一个程序,而是windows shell中的一个命令(cmd.exe),所以你需要运行带参数的'cmd'来运行dir并输出流。

var spawn = require('child_process').spawn
spawn('cmd', ['/c', 'dir'], { stdio: 'inherit'})

通过使用“inherit”,输出将通过管道传送到当前进程。

chhkpiq4

chhkpiq42#

对于每个文档的节点8,您需要将shell选项设置为true(默认情况下为false)。

spawn('dir', [], { shell: true })

此处提供文档

vmjh9lq9

vmjh9lq93#

(首先,ls是否真的存在于Windows上?)
不久前,我在生成子进程时遇到过类似的问题,我花了很长时间才找到正确的方法。
下面是一些示例代码:

var spawn = require('child_process').spawn;
var cp = spawn(process.env.comspec, ['/c', 'command', '-arg1', '-arg2']);
 
cp.stdout.on("data", function(data) {
    console.log(data.toString());
});
 
cp.stderr.on("data", function(data) {
    console.error(data.toString());
});

请查看此票证以了解此问题的说明:https://github.com/joyent/node/issues/2318
[2022年12月25日更新]根据Gorky's answer,只需设置shell: true

pgx2nnw8

pgx2nnw84#

对这个问题已有两个可行的答案,但我想再提一个,并澄清一些问题。
如果您不打算从命令中返回大量数据(超过200 kB),可以使用exec而不是spawn,并更优雅地编写:

exec('dir [possible arguments]', (err, stdout, stderr) => {
    console.log(`stdout: ${stdout}`)
})

阅读difference between spawn and exec.以确保它符合您的需要。
对于澄清,无需通过{stdio:'inherit'}来派生,因为它在默认情况下创建管道。请参阅文档:
默认情况下,stdin、stdout和stderr的管道是在父Node.js进程和派生的子进程之间建立的。可以通过这些管道以非阻塞方式传输数据。但是请注意,一些程序在内部使用行缓冲I/O。虽然这不会影响Node.js,但可能意味着发送到子进程的数据可能不会立即使用。

ru9i0ody

ru9i0ody5#

嗨下面的代码为我工作。

const spawn = require('child_process').spawn;
const bat = spawn('cmd.exe', ['/c','calc.exe']);

bat.stdout.on('data', (data) => {
  console.log(data);
});

bat.stderr.on('data', (data) => {
  console.log(data);
});

bat.on('closed', (code) => {
 alert(`Child exited with code ${code}`);
});

相关问题