Javascript 节点、Windows、wmic标准

Javascript 节点、Windows、wmic标准,javascript,windows,node.js,wmi,wmic,Javascript,Windows,Node.js,Wmi,Wmic,我在NodeJS中的Windows程序WMIC.exe(用于查询Windows Management Instrumentation)有问题 我可以生成wmic.exe进程,但它不会输出任何内容或接受任何输入。但是,如果我将stdin设置为null,它将正确运行并接收输出 var spawn = require('child_process').spawn; var wmic = spawn('wmic', [], {stdio: ['ignore']}); wmic.stdout.on('d

我在NodeJS中的Windows程序WMIC.exe(用于查询Windows Management Instrumentation)有问题

我可以生成wmic.exe进程,但它不会输出任何内容或接受任何输入。但是,如果我将stdin设置为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上也有类似的问题,但他们只想捕获单个查询的输出,所以空stdin对他们来说并不重要

更新

如果我做下面的事

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
,但由应用程序的输入驱动,而不是在控制台键入的输入

对于任何应用程序来说,实现这一点的正常方法是从管道向其提供输入。如果不指定任何其他
stdio
选项,NodeJS在默认情况下似乎可以创建管道

问题在于
wmic
从管道接收输入时表现不好。在输入完成之前,它拒绝做任何事情;然后,它处理所有的输入并停止寻找更多的输入
wmic
认为管道关闭或接收到CTRL-Z时输入已完成

因此,您不能发出一个命令,读取输出,然后再发出另一个命令
wmic
在认为已接收到所有命令后才写入输出,然后不再接受任何命令

您可以在控制台上演示此问题
type con:|wmic
通过管道输入键盘,因此
wmic
进入中断模式。在下面的示例中,接下来是几个命令。请注意,
wmic
在输入
CTRL-Z
之前不会执行任何操作

C:\>类型con:| wmic
cpu获取名称
用户帐户列表摘要
^Z
wmic:root\cli>cpu获取名称
名称
奔腾(R)双核CPU T4500@2.30GHz
wmic:root\cli>
“/?”如需帮助,请退出以退出。
wmic:root\cli>用户帐户列表摘要
AccountType标题域全名
512青蛙管理员青蛙管理员
wmic:root\cli>
“/?”如需帮助,请退出以退出。
wmic:root\cli>
C:\>
您可能会认为(看看这个示例),
wmic
只是有一个大的输出缓冲区。但是,如果打开跟踪(
/TRACE:on
作为第一个命令)
wmic
会产生大量输出,但在输入完成之前不会产生任何结果

解决方案是不重定向标准输入,如最后一个示例,因此输入来自键盘。(注意:当Windows控制台应用程序接收到来自键盘的输入时,它不是通过管道来的。因此,您的最后一个示例不是使用管道,这就是is行为不同的原因。)


然后,您可以通过模拟击键向wmic提供输入。建议几种方法:使用
SendKeys
或发送
WM\u KEYUP
消息。这不是一个很好的解决方案。

这就是它对我的作用:

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' );
为了子孙后代

现在可以使用
ms wmic
软件包:
这完全不必直接与CLI交互,并允许您通过预设API处理WMIC


但是在上面的示例中,您尝试使用
WMIC
的具体内容也由
windows cpu
包处理:


这是一个相当奇怪的问题,我已经做了大约两个小时的测试,WMIC始终将
EOF
视为一条换行符(自动关闭流)。我还测试了生成
cmd
powershell
)和作为命令运行
wmic.exe
,结果是一样的。将继续测试。同意,我继续使用生成cmd并使用它启动wmic.exe,但问题与往常一样。我觉得这个过程很奇怪。stdin会让它继续下去,肯定会发生一些奇怪的事情。感谢您的关注;)