【发布时间】:2013-08-29 14:41:05
【问题描述】:
我在使用 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 的提示,并且它保持打开状态。但是,我无法通过代码向它发送输入,但可以直接在命令提示符窗口中输入。我输入的任何内容都会通过节点脚本正确执行和输出。再一次,奇怪的是它与这个管道一起工作,但不是我设置的任何管道,对我来说毫无用处,因为我想通过代码发送命令,而不是输入它们。
【问题讨论】:
-
这是一个非常奇怪的问题,我已经完成了大约两个小时的测试,WMIC 始终将
EOF视为换行符(它会自动关闭流)。我还测试了产卵cmd(也有powershell)并运行wmic.exe作为命令,结果是一样的。将继续测试。 -
同意,我沿着生成 cmd 的路线走,并使用它来启动 wmic.exe,但问题与往常一样。我觉得奇怪的是 process.stdin 会让它继续下去,这肯定是一些奇怪的事情。感谢您查看 ;)
标签: javascript windows node.js wmi wmic