从node.js运行Windows批处理文件

17

我正在尝试在node.js中运行test.bat文件。

以下是代码:

var exec = require('child_process').execFile;

case '/start':
    req.on('data', function (chunk) {});
    req.on('end', function () {
      console.log("INSIDE--------------------------------:");      
       exec('./uli.bat', function (err, data) {
        console.log(err);
        console.log(data);
        res.end(data);
      });
    });
    break;

运行此node.js文件时,我遇到了以下问题:

INSIDE--------------------------------:
{ [Error: Command failed: '.' is not recognized as an internal or ext
nd,
operable program or batch file.
] killed: false, code: 1, signal: null }

1
最好您发布完整的输出,而不是奇怪地裁剪部分 :)。此外,那个 ./ 路径看起来非常像 Unix。 - salezica
这是完整的输出 - Sush
你尝试过在 .bat 文件路径中去掉 ./ 吗? - fiskeben
4个回答

17

我已经找到了解决方案...对我来说很有效。这将打开一个新的命令窗口,并在子进程中运行我的主要 node JS。不需要提供 cmd.exe 的完整路径。我之前一直犯这个错误。

var spawn = require('child_process').spawn,
ls    = spawn('cmd.exe', ['/c', 'my.bat']);

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

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

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

这在Windows上不起作用。Spawn只能在Linux的shell环境下工作。 - Sohan
11
我可以确认,这确实在Windows中可行,用于执行“.bat”文件。 - davidmdem
在Windows下,如果您想为批处理文件使用相对路径,请使用模板字符串,例如:spawn('cmd.exe',["/c", \..\BINARIES\t1.bat`],{env: process.env});`。 - user3526
我遇到了“未捕获的引用错误:require未定义”的错误。有人知道为什么会出现这个错误以及如何解决吗? - Sonalk
尝试使用此代码时,出现了“未捕获的错误:spawn”错误。 - anirudh talluri

5
在Windows中,我不喜欢使用spawn命令,因为它会创建一个新的cmd.exe,并且我们需要将.bat或.cmd文件作为参数传递。相比之下,exec是更好的选择。示例如下:
请注意,在Windows中,您需要使用双反斜杠来传递路径。例如:C:\\path\\batfilename.bat
const { exec } = require('child_process');
exec("path", (err, stdout, stderr) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(stdout);
});

5
我知道的最简单的执行方法是以下代码:

最简单的执行方法是以下代码:

require('child_process').exec("path/to/your/file.bat", function (err, stdout, stderr) {
    if (err) {
        // Ooops.
        // console.log(stderr);
        return console.log(err);
    }

    // Done.
    console.log(stdout);
});

如果你的文件在当前脚本所在的目录中,你可以用__dirname + "/file.bat"代替"path/to/your/file.bat"


无论我如何尝试,都会得到相同的错误:`错误:命令失败:E:/devProj/instager/start.bat 错误:不支持输入重定向,立即退出进程。在ChildProcess.exithandler (child_process.js:217:12) 在emitTwo (events.js:106:13) 在ChildProcess.emit (events.js:194:7) 在maybeClose (internal/child_process.js:899:16) 在Process.ChildProcess._handle.onexit (internal/child_process.js:226:5) killed: false, code: 1, signal: null, cmd: 'E:/devProj/instager/start.bat'` - Andrija Jostergård

4
我知道一个更简单的执行代码的方法,如下所示:

function Process() {
    const process = require('child_process');
    var ls = process.spawn('script.bat');
    ls.stdout.on('data', function (data) {
        console.log(data);
    });
    ls.stderr.on('data', function (data) {
        console.log(data);
    });
    ls.on('close', function (code) {
        if (code == 0)
            console.log('Stop');
        else
            console.log('Start');
    });
};

Process();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接