gpt4 book ai didi

node.js - Node - 生成同步命令用法

转载 作者:行者123 更新时间:2023-12-03 12:32:42 24 4
gpt4 key购买 nike

我正在编写一个执行终端命令并将输出写入应用程序的 Electron 应用程序。如果我只执行一个命令,这很容易:

const { spawn } = require('child_process');

commandOutput = document.getElementById("command-output") // textarea
status = document.getElementById("status") // div

command = "some"
args = ["command"]
dir = "some/dir"
var child = spawn(command, args, {
cwd: dir
});

child.on('error', function (err) {
commandOutput.value += 'error: <' + err + '>';
});

child.stdout.on('data', function (data) {
commandOutput.value += data;
});

child.stderr.on('data', function (data) {
commandOutput.value += 'stderr: <' + data + '>';
});

child.on('close', function (code) {
status.innerHTML = 'child process exited with code ' + code;
});
我喜欢这种方法,因为输出是流式传输而不是缓冲的,允许我将其实时写入 UI,而不是等待进程完成(可能需要一些时间)。但是,我想不出一种方法来一个接一个地生成多个同步命令。我知道有一个命令 spawnSync可以处理这个,但文档没有描述如何使用它。或者,如果有更好的方法,我也愿意接受。

最佳答案

实现此目的的一种方法是在 close 上生成下一个命令。上一个命令的事件。假设您当前的代码,您可以使用以下代码:

child.on ("close", function (code) {
status.innerHTML = 'child process exited with code ' + code;

// Now spawn the second child
var secondChild = spawn (secondCmd, secondArgs, { cwd: dir });
secondChild.on ("error", (err) => { /* error handler */});
// Register all other handlers as well...
});
如果您希望输出缓冲,这就是要走的路。此外,您可以将所有代码生成过程放入一个函数中,然后在 close 上调用该函数。事件,就像这样:
function spawnExternalProgram (command, args, dir, next) {
// Suggestion: Clear the commandOutput field here?

var child = spawn(command, args, {
cwd: dir
});

child.on('error', function (err) {
commandOutput.value += 'error: <' + err + '>';
});

child.stdout.on('data', function (data) {
commandOutput.value += data;
});

child.stderr.on('data', function (data) {
commandOutput.value += 'stderr: <' + data + '>';
});

child.on('close', function (code) {
status.innerHTML = 'child process exited with code ' + code;
next ();
});
}

spawnExternalProgram ("some", [ "command" ], "some/dir", function () { // 1
spawnExternalProgram ("some", [ "other", "command" ], "some/dir", function () { //2
spawnExternalProgram ("yet", [ "another", "command" ], "some/dir", () => {}); // 3
});
});
一旦前一个进程退出,这将依次生成命令 1、2 和 3。 next 的最后一个参数,即 () => {}相当于 function () {} .
正如您已经提到的,您可以使用的另一个选项是 spawnSync。 .使用此模块,您可以通过单个函数调用一个接一个地生成进程。但是请注意,如果您从渲染器进程生成进程,这可能会阻塞您的 UI。用法类似:
const { spawnSync } = require('child_process');

commandOutput = document.getElementById("command-output")
status = document.getElementById("status")

command = "some"
args = ["command"]
dir = "some/dir"
var childResultOne = spawnSync (command, args, { cwd: dir });

// Check if the process terminated:
var childOneHasTerminated = childResultOne.status === null || childResultOne.status !== 0;

// Access the stdout buffer via the childResultOne object:
var childOneOutput = childResultOne.stdout;

// ---
command = "someOther"
args = ["command", "asWell"]
dir = "some/other/dir"

// Spawn a second child process
var childResultTwo = spawnSync (command, args, { cwd: dir });

// Do all the checks as above.
请注意,这只会在调用 spawnSync 之后运行代码。一旦进程退出,即成功运行( status === 0 ),已被杀死( status === null && signal !== null )或崩溃( status !== 0 )。这基本上是 Linux 或 MacOS Shell 或 Window 的 cmd.exe 的方式。将解释一个shell脚本或一个批处理文件——一个又一个命令。

关于node.js - Node - 生成同步命令用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64226373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com