带有字符串未数组的nodejs生成命令吗?

时间:2019-08-09 12:22:46

标签: node.js

我正在使用nodejs上的spawn。以前我使用的是exec,但是exec在stdout(或stderr)转换中不兼容。 现在,我对产卵有残疾。看起来,虽然exec接受了带引号的字符串命令,但spawn却不接受那个,只是数组格式。

因此以下exec脚本正常运行,但由于字符串格式的命令不是数组,因此另一个使用spawn的脚本将出错。

const exec = require('child_process').exec;

exec(` echo foo bar `, (error, stdout, stderr) => {
  if ( error ){ console.log(error) }
  if ( stdout ){ console.log(stdout) }
  if ( stderr ){ console.log(stderr) }
});
const { spawn } = require('child_process');

command = spawn('echo foo bar');

command.stdout.on('data', function (data) {
  console.log(data.toString());
});

command.stderr.on('data', function (data) {
  console.log( data.toString());
});

command.on('exit', function (code) {
  console.log( code.toString());
});

我有很多命令行脚本,这是我想在nodejs上spawn使用的脚本,而且它们都很复杂,类似于下面的脚本。这就是为什么我要使用字符串格式指定命令而不是数组。有想法吗?

exec(' bash -ic "expecto \\"sudo bash -ic \\\\\\"rd ; backup_important_batch\\\\\\"\\" $PASSWORD" ', (error, stdout, stderr) => {
    if ( error ){ console.log(error) }
    if ( stdout ){ console.log(stdout) }
    if ( stderr ){ console.log(stderr) }
});

3 个答案:

答案 0 :(得分:0)

尝试自动拆分命令,例如:

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

let cmd = 'echo foo bar'
let cmdarray = cmd.split(" ");
let command = spawn(cmdarray.shift(), cmdarray);

答案 1 :(得分:0)

您不能在空格上分割,因为许多命令行参数可能包含诸如$breakpoints:( large: 'min-width: 900px', medium: 'min-width: 600px', small: 'min-width: none' ); @each $key,$val in $breakpoints{ @media (#{$val}) { @for $i from 1 through 100 { .t-#{$i} { top: 1% * $i; } } } } 之类的字符串,在字符串上分割会错误地给您./foo.js --bar "Hello Baz" "Hello作为参数。

使用类似https://www.npmjs.com/package/string-argv的库将字符串转换为可以传递给字符串的参数,获取数组结果并建立Baz"调用。

编辑:这是一个示例:

spawn()

答案 2 :(得分:0)

根据上面 Venryx 的评论(链接 https://stackoverflow.com/a/45134890/2441655 的现有答案),您可以使用 spawn(cmd, [], { shell: true })

例如

const { spawn } = require('child_process');
const command = spawn('echo foo bar', [], { shell: true });

command.stdout.on('data',data => console.log(data.toString()));
command.stderr.on('data', function (data) {console.log( data.toString());});
command.on('exit', function (code) {console.log( code.toString());});

// foo bar
//
// 0