Node.js学习指南第二版第8章讲的是child_process,用来创建子进程执行操作系统Shell命令的。
书中的代码示例只给了UNIX版本的代码,在Linux和OSX系统上可以使用,但是在Windows系统上无法工作。这对于使用Windows系统学习Node的同学非常不友好。
其实两个命令主要的不同基本只有shell命令的区别。因此我把书中大部分例子转换为了Windows版本的代码,方便使用Windows学习的同学。
8.1节 P157-158 代码
var spawn = require('child_process').spawn;
var pwd = spawn('chdir', {shell: true});
pwd.stdout.on('data', data => console.log(`stdout: ${data}`));
pwd.stderr.on('data', data => console.error(`stderr: ${data}`));
pwd.on('close', code => console.log(`child process exited with code ${code}`));
8.1节 P158中间 错误代码
var pwd = spawn('chdir', ['-p'], {shell: true});
8.1节 P158-159 例8-1 代码
// shell: dir . /S /B | findstr test
var spawn = require('child_process').spawn;
var dir = spawn('dir', ['.', '/S', '/B'], {shell: true});
var findstr = spawn('findstr', ['test'], {shell: true});
findstr.stdout.setEncoding('utf8');
dir.stdout.pipe(findstr.stdin);
findstr.stdout.on('data', data => console.log(`stdout: ${data}`));
findstr.stderr.on('data', data => console.error(`findstr stderr: ${data}`));
dir.stderr.on('data', data => console.error(`dir stderr: ${data}`));
dir.on('close', function (code) {
if (code !== 0) {
console.log(`dir process exited with code ${code}`);
}
});
findstr.on('exit', function (code) {
if (code !== 0) {
console.log(`dir process exited with code ${code}`);
}
});
8.1节 P160 代码
不包含关闭行缓存的部分
// tasklist /NH | findstr apache2
var spawn = require('child_process').spawn;
var tasklist = spawn('tasklist', ['/NH'], {shell: true});
var findstr = spawn('findstr', ['apache2'], {shell: true});
tasklist.stdout.pipe(findstr.stdin);
tasklist.stderr.on('data', data => console.log(`tasklist stderr: ${data}`));
tasklist.on('close', function (code) {
if (code !== 0) {
console.log(`tasklist process exited with code ${code}`);
}
});
findstr.stdout.on('data', data => console.log('' + data));
findstr.stderr.on('data', data => console.log(`findstr stderr: ${data}`));
findstr.on('close', function (code) {
if(code !== 0) {
console.log(`findstr process exited with code ${code}`);
}
})
8.1.1节 P161 execfile代码
var execfile = require('child_process').execFile;
var child = execfile('node', ['app.js'], function (error, stdout, stderr) {
if (error == null) {
console.log(`stdout: ${stdout}`);
}
});
/*
app.js
console.log(global);
*/
8.1.1节 P161-162 exec代码
var exec = require('child_process').exec;
var child = exec('node app.js', function(error, stdout, stderr) {
if(error) return console.error(error);
console.log(`stdout ${stdout}`);
})
/*
app.js
console.log(global);
*/
8.1.1节 P162 代码 略
8.1.1节 P163 代码 (与书上相同)
const cp = require('child_process');
const child = cp.execFile('node', ['-i'], (err, stdout, stderr) => {
console.log(stdout);
})
child.stdin.write('process.version;\n');
child.stdin.end();
8.1.2节 代码与书上相同
8.2节则本身就是在windows系统上运行。
代码为根据书中示例原创修改。