Javascript WshShell在不等待但执行状态更新的情况下运行(运行与执行问题)
在Windows环境中通过JS启动脚本 我需要两样东西:Javascript WshShell在不等待但执行状态更新的情况下运行(运行与执行问题),javascript,windows,exec,wsh,Javascript,Windows,Exec,Wsh,在Windows环境中通过JS启动脚本 我需要两样东西: 没有弹出窗口(即shell.run(cmd,0)) 我不能等待线程完成(即shell.exec()或shell.run(cmd,0,false)) 那我该怎么办?这些似乎是相互排斥的。我等不及它完成了,但我会调查它的状态,看看它什么时候完成。显然,exec更适合于此,因为它包含状态等…尽管我需要取消弹出命令窗口,因为此系统可能有很多 有人知道我能做什么吗?无论如何,我都会进行轮询,但如果不等待进程完成,run将立即返回0,除了尝试在进程列
shell.run(cmd,0)
)shell.exec()
或shell.run(cmd,0,false)
)理想的做法是exec,但隐藏命令窗口…但据我所知,这是不可能的…您可以使用Win32\u 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);
}
您可以使用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);
}