Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript WshShell在不等待但执行状态更新的情况下运行(运行与执行问题)_Javascript_Windows_Exec_Wsh - Fatal编程技术网

Javascript WshShell在不等待但执行状态更新的情况下运行(运行与执行问题)

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,除了尝试在进程列

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

我需要两样东西:

  • 没有弹出窗口(即
    shell.run(cmd,0)
  • 我不能等待线程完成(即
    shell.exec()
    shell.run(cmd,0,false)
  • 那我该怎么办?这些似乎是相互排斥的。我等不及它完成了,但我会调查它的状态,看看它什么时候完成。显然,exec更适合于此,因为它包含状态等…尽管我需要取消弹出命令窗口,因为此系统可能有很多

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


    理想的做法是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);
    }