gpt4 book ai didi

javascript - WshShell 无需等待即可运行,但执行状态更新(运行与执行问题)

转载 作者:行者123 更新时间:2023-11-28 02:14:23 26 4
gpt4 key购买 nike

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

我需要两件事:

  1. 没有弹出窗口(即shell.run(cmd, 0))
  2. 我迫不及待地等待线程完成(即 shell.exec()shell.run(cmd, 0, false))

那我该怎么办?这些似乎是相互排斥的。我等不及它完成,但我会轮询它的状态以查看它何时完成。显然 exec 更适合这个,因为它包含状态等...尽管我需要取消弹出命令窗口,因为这个系统可能有很多弹出命令窗口..

有人知道我能做什么吗?无论如何,我都会进行轮询,但如果不等待进程完成,运行将立即返回 0,除了尝试在进程列表中查找图像名称之外,我不知道它是否已完成......但我不喜欢在没有 PID 的情况下这样做,我宁愿不依赖名称。

理想的是 exec 但隐藏命令窗口...但据我所知这是不可能的...

最佳答案

您可以使用 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);
}

关于javascript - WshShell 无需等待即可运行,但执行状态更新(运行与执行问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16618417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com