Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在节点JS上生成(Windows Server 2012)_Windows_Node.js_Windows Server 2012_Spawn - Fatal编程技术网

在节点JS上生成(Windows Server 2012)

在节点JS上生成(Windows Server 2012),windows,node.js,windows-server-2012,spawn,Windows,Node.js,Windows Server 2012,Spawn,当我运行此节点时: 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

当我运行此节点时:

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上。有什么想法吗?

(首先,
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());
});
请查看此问题的解释:

如前所述,只要不创建别名,windows上就不存在ls。您将使用“dir”。不同之处在于,dir不是一个程序,而是windows shell中的一个命令(cmd.exe),因此您需要运行带有参数的“cmd”来运行dir并输出流

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

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

这个问题已经有两个可行的答案,但我想再提一个并澄清一些问题

如果您不打算从命令返回大量数据(超过200kB),则可以使用exec而不是spawn,并更优雅地编写:

exec('dir [possible arguments]', (err, stdout, stderr) => {
    console.log(`stdout: ${stdout}`)
})
了解。以确保它符合您的需要

至于澄清,没有必要将{stdio:'inherit'}传递给spawn,因为它默认创建管道。发件人:

默认情况下,stdin、stdout和stderr的管道在 父Node.js进程和派生的子进程。有可能 以非阻塞方式通过这些管道传输数据。然而,请注意, 有些程序在内部使用行缓冲I/O。尽管如此 不影响Node.js,这可能意味着将数据发送到子进程 可能不会立即食用


嗨,下面的代码对我有用

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}`);
});

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


文档

这是IMHO的最新最佳答案。这是最佳答案,因为它涵盖了其他人的所有答案。事实上,
shell:true
在windows上使用
process.env.comspec
并返回到
cmd/c
,在unix系统上使用
/bin/sh
。太棒了!它起作用了
spawn('dir', [], { shell: true })