Node.js 如何运行带有输入和输出的批处理文件
在本文中,我们将看到如何在Node.js中运行带有输入和输出文件的批处理文件。批处理文件是一个按顺序存储要执行的命令的脚本文件。
Node.js是异步的,它不会等待批处理文件执行完成。相反,它调用定义批处理文件执行时间的函数,并尝试打印数据,即使尚未获取到数据。
解决方案: 解决方案是使用一个名为Child Process的Node.js模块。Child Process包含一个名为’spawn’的方法,以异步方式派生子进程,而不会阻塞Node.js。
让我们一步步看完整的过程。
步骤1: 创建一个文件夹,文件夹内创建app.js文件、input.txt文件和bash.sh文件。在input.txt文件和bash.sh文件中写入下面给出的代码。
input.txt
Hello Geeks!
bash.sh
#!/bin/bash
input=`cat -`
echo "Input: $input"
步骤2: 将此文件夹定位到终端,并键入命令。
npm init -y
它初始化了我们的node.js应用程序。
步骤3: 在项目中使用以下命令安装Child Process模块
node install child_process
步骤4: 在 ‘app.js’ 文件中,引入Child Process模块,并创建一个常量 ‘bash_run’ 用于执行bash文件。
const childProcess = require("child_process");
const bash_run = childProcess.spawn(
'/bin/bash',["test.sh"],{env: process.env});
步骤5 :现在,让我们使用 ‘stdout’ 方法来打印结果,并使用 ‘stderr’ 来打印错误。
bash_run.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
bash_run.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
步骤6: 现在,使用 文件系统模块 分别为输入文件和输出文件创建读取和写入流。然后,我们将使用之前创建的 bash_run 方法将输入文本文件的结果发送到输出文本文件。
const fs = require("fs");
const input = fs.createReadStream("input.txt");
const output = fs.createWriteStream("output.txt");
bash_run.stdout.pipe(output);
input.pipe(bash_run.stdin);
完整代码:
app.js
const childProcess = require("child_process");
const bash_run = childProcess.spawn('/bin/bash',
["bash.sh"], { env: process.env });
bash_run.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
bash_run.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
const fs = require("fs");
const output = fs.createWriteStream("output.txt");
const input = fs.createReadStream("input.txt");
bash_run.stdout.pipe(output);
input.pipe(bash_run.stdin);
运行应用的步骤: 打开终端并输入以下命令。
node app.js
输出: