我在 NodeJS 中遇到了 Windows 程序 WMIC.exe(用于查询 Windows Management Instrumentation)的问题。
我可以生成一个 wmic.exe 进程,但它不会输出任何内容或接受任何输入。但是,如果我将标准输入设置为 null,它将正确运行并且我会收到输出。
var spawn = require('child_process').spawn;
var wmic = spawn('wmic', [], {stdio: ['ignore']});
wmic.stdout.on('data', function(data) {
console.log('Data received:' + data);
});
wmic.on('close', function(code) {
console.log('Spawned process ended with code: ' + code);
});
我想以交互方式使用它支持的 wmic.exe,使其保持打开状态,这样我就不必为每个 WMI 查询重复启动它。其他人在使用 wmic.exe 时也遇到过类似的问题,但他们只想捕获单个查询的输出,因此拥有空标准输入对他们来说并不重要。
更新
如果我执行以下操作...
var spawn = require('child_process').spawn;
var wmic = spawn('wmic', []);
wmic.stdout.on('data', function(data) {
console.log('Data received:' + data);
});
wmic.stderr.on('data', function(data) {
console.log('Error! - ' + data);
});
wmic.on('close', function(code) {
console.log('Spawned process ended with code: ' + code);
});
wmic.stdin.end('cpu get caption /format:csv\n');
然后它实际上会响应一个结果,提示为下一个查询做好准备,但接下来会结束该过程,显然我不能在 .end() 之后使用 .write()。相反,将其更改为 .write(),进程根本没有响应,我什至没有从使用 .end() 时收到的 stdout "wmic:root\cli>" 得到提示。
或者
wmic.stdin.push(null);
wmic.stdin.write('cpu/n'); // Ctrl-Z aka Windows EOF control code
如果我使用上面的方法,而不是 .end() 调用,它也可以工作。但似乎如果我不继续向它抛出常量数据,该过程就会结束。
甚至
wmic.stdin.write('cpu');
wmic.stdin.write('\x1a');
这也有效,但是 wmic.exe 进程再次决定在返回 cpu 结果后退出。:/
几乎
var wmic = spawn('wmic.exe', [], {stdio: [process.stdin, 'pipe', 'pipe']});
这行得通。该过程正确启动,因此我通过 wmic.stdout.on('data', fn) 收到来自 wmic.exe 的提示,并且它保持打开状态。但是,我无法通过代码向它发送输入,但可以直接在命令提示符窗口中输入。我输入的任何内容都会通过节点脚本正确执行和输出。再一次,奇怪的是它与这个管道一起工作,但不是我设置的,对我来说没用,因为我想通过代码发送命令,而不是输入它们。