如何通过NodeJS子进程运行命令?

Tow*_*wer 29 shell process command-prompt command-line-interface node.js

我试图通过NodeJS子进程在Windows上运行命令:

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

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

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

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

setTimeout(function() {
    terminal.stdin.write('echo %PATH%');
}, 2000);
Run Code Online (Sandbox Code Playgroud)

当它调用时ti.stdin.write,它会将其写入stdin描述符,但是如何cmd在此时触发响应?当您在命令提示符中实际输入时,如何发送"enter"键信号?目前我没有回复cmd.

toa*_*abi 37

发送换行符\n将执行该命令..end()将退出shell.

我修改了示例以使用bash,因为我在osx上.

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

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

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

setTimeout(function() {
    console.log('Sending stdin to terminal');
    terminal.stdin.write('echo "Hello $USER. Your machine runs since:"\n');
    terminal.stdin.write('uptime\n');
    console.log('Ending terminal session');
    terminal.stdin.end();
}, 1000);
Run Code Online (Sandbox Code Playgroud)

输出将是:

Sending stdin to terminal
Ending terminal session
stdout: Hello root. Your machine runs since:
stdout: 9:47  up 50 mins, 2 users, load averages: 1.75 1.58 1.42
child process exited with code 0
Run Code Online (Sandbox Code Playgroud)


Rai*_*ets 26

您只需使用以下命令发送行结束(\n):

setTimeout(function() {
    terminal.stdin.write('echo %PATH%\n');
}, 2000);
Run Code Online (Sandbox Code Playgroud)

  • +1 @Raivo Laanemets - 这是该问题的实际答案.虽然你确实需要在某个时候调用`stdin.end()`如果你想处理多个读/响应你应该用换行符终止(`\n`适用于windows xp/7) (3认同)

cui*_*ing 6

您可以使用child_process exec方法.这是一个例子:

var exec = require('child_process').exec,
    child;

child = exec('echo %PATH%',
    function (error, stdout, stderr) {
        if(stdout!==''){
            console.log('---------stdout: ---------\n' + stdout);
        }
        if(stderr!==''){
            console.log('---------stderr: ---------\n' + stderr);
        }
        if (error !== null) {
            console.log('---------exec error: ---------\n[' + error+']');
        }
    });
Run Code Online (Sandbox Code Playgroud)