WshShell运行时无需等待但执行状态更新(运行vs exec问题)

时间:2013-05-17 21:47:51

标签: javascript windows exec wsh

在Windows环境中通过JS启动脚本。

我需要两件事:

  1. 没有弹出窗口(即shell.run(cmd, 0)
  2. 我不能等待线程完成(即。​​shell.exec()shell.run(cmd, 0, false)
  3. 那我该怎么办?这些看似相互排斥。我不能等待它完成,但我将轮询其状态以查看它何时完成。显然exec更适合这个,因为它包含状态等等......虽然我需要取消弹出命令窗口,因为这个系统可能有很多...

    有人知道我能做什么吗?无论如何我都会进行投票,但是没有等待完成的过程,运行将立即返回0,并且我不知道它是否已经完成而不是尝试在进程列表中找到图像名称...但是我如果没有PID,我不喜欢这样做,我宁愿不依赖名字。

    理想的是执行但是隐藏命令窗口......但是从我所知道的这是不可能的......

1 个答案:

答案 0 :(得分:1)

您可以使用Win32_Process WMI类启动可执行文件以获取其进程ID。在此之后,您可以查询WMI以判断进程是否仍在运行。例如:

var SW_SHOWMINNOACTIVE = 7;

var WMI = GetObject("winmgmts:{impersonationlevel=impersonate}!root/CIMV2");

function processExists(processId) {
  var processColl = new Enumerator(WMI.ExecQuery("select ProcessId " +
    "from Win32_Process where ProcessId=" + processId.toString()));
  return ! processColl.atEnd();
}

var startInfo = WMI.Get("Win32_ProcessStartup").SpawnInstance_();
startInfo.ShowWindow = SW_SHOWMINNOACTIVE;

var process = WMI.Get("Win32_Process");
var method = process.Methods_.Item("Create");
var inParams = method.InParameters.SpawnInstance_();
inParams.CommandLine = "cmd.exe";
inParams.CurrentDirectory = null;
inParams.ProcessStartupInformation = startInfo;

var outParams = process.ExecMethod_(method.Name, inParams);
if ( outParams.ReturnValue == 0 ) {
  var processId = outParams.ProcessId;
  WScript.Echo("ProcessId: " + processId.toString());
} else {
  WScript.Echo("ReturnValue: " + outParams.ReturnValue);
  WScript.Quit(outParams.ReturnValue);
}

while ( processExists(processId) ) {
  WScript.Echo("Process still running");
  WScript.Sleep(1000);
}