JavaScript ActiveXObject-如何运行win32应用程序并在下一步之前等待其终止?

JavaScript ActiveXObject-如何运行win32应用程序并在下一步之前等待其终止?,javascript,batch-file,command-prompt,activexobject,Javascript,Batch File,Command Prompt,Activexobject,命令行中“启动/等待”的正常行为: start/wait services.msc/computer=localhost& 我想在HTML->JavaScript->ActiveXObject->Windowsshell中使用上述命令。 为此,在Windows Shell中,我必须首先调用CMD,否则它将无法工作 问题:在加载GUI窗口后,用“&”分隔的附加命令会立即执行。为什么/wait开关不等待GUI进程的终止 例如: function Example() { var command =

命令行中“启动/等待”的正常行为: start/wait services.msc/computer=localhost&

我想在HTML->JavaScript->ActiveXObject->Windowsshell中使用上述命令。 为此,在Windows Shell中,我必须首先调用CMD,否则它将无法工作

问题:在加载GUI窗口后,用“&”分隔的附加命令会立即执行。为什么/wait开关不等待GUI进程的终止

例如:

function Example() {
  var command = "cmd /c start /wait <GUI_process.exe> <Parameters> & <execute 
  some cleanup commands if GUI is closed>;

  var WinShell = new ActiveXObject("WScript.Shell");
  WinShell.Run(command, 1, false);
}
函数示例(){
var command=“cmd/c启动/等待&”;
var WinShell=newActiveXObject(“WScript.Shell”);
Run(命令,1,false);
}
看来没有办法克服start/wait命令中的错误。Microsoft很久以前就放弃了对预定义命令的支持

解决方法:PowerShell

对于调用的GUI,只有Cmdlet命令“Start Process-Wait”按预期工作

斗争:在某些工作站上,PowerShell被GPO禁用,因此我无法使用它

真正的问题是:在上面的例子中,有没有办法让“开始/等待”正常工作?

[见下面的故事]

<!DOCTYPE html>
<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script>
            function fun(){
                var fs = new ActiveXObject("Scripting.FileSystemObject");
                var tmp = fs.GetSpecialFolder(2);
                var cs = fs.OpenTextFile(tmp+"\\test.cs", 8, true);
                cs.WriteLine("using System.Diagnostics;class test{public static void Main(string[] args){");
                cs.WriteLine("ProcessStartInfo processInfo = new ProcessStartInfo(\"cmd.exe\", \"/c %TMP%\\\\test.bat\");");
                cs.WriteLine("Process.Start(processInfo).Close();}}");
                cs.Close();
                var bat=fs.OpenTextFile(tmp+"\\test.bat", 8, true);
                bat.WriteLine("echo ASDF");
                bat.WriteLine("services.msc");
                bat.WriteLine("echo ZXCV");
                bat.WriteLine("pause");
                bat.Close();
                var command="cmd /c \\Windows\\Microsoft.NET\\Framework\\v3.5\\csc.exe /out:%tmp%\\test.exe %tmp%\\test.cs & %tmp%\\test.exe & pause";
                var WinShell = new ActiveXObject("WScript.Shell");
                WinShell.Run(command, 1, false);
            }
        </script>
    </head>
    <body>
        <button onclick="fun()">Butt</button>
    </body>
</html>
…然后它成功了

当然,关于2018年,这里有各种各样的警告,比如ActiveX如何大规模谋杀海豹宝宝和毛茸茸的小猫等等。

此外,如果要支持非Win7 OS es,代码可以查看现有的.NET框架,并使用现有的框架。此外,由于硬编码的
test.xy
-s可能会伤害他人的眼睛,可以用于创建不冲突的名称(或单个名称,与不同的扩展一起重用,就像
test
),虽然扩展名必须是.cs、.exe和.bat(也许.cs可以是其他的,我没有尝试过).

您是否考虑过
&&
&&-像single&一样工作。我发现问题来自参数。如果我至少使用一个参数,等待开关不工作。例如:mmc.exe services.msc&&taskmgr.exe。如果跳过services.msc,等待开关工作正常。不要使用
start
命令。尝试以下操作:
cmd/C calc.exe |暂停并回显calc.exe关闭后显示此内容
using System.Diagnostics;
class test{
  public static void Main(string[] args){
    ProcessStartInfo processInfo = new ProcessStartInfo("cmd.exe", "/c %USERPROFILE%\\Documents\\NetBeansProjects\\CmdTest\\test.bat");
    Process.Start(processInfo).Close();
  }
}