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

时间:2018-04-14 12:59:41

标签: javascript batch-file command-prompt activexobject

命令行中“start / wait”的正常行为: 启动/等待services.msc / computer = localhost& <“GUI关闭时的附加命令”>

我想在HTML-> JavaScript-> ActiveXObject-> Windows Shell中使用上述命令。 为此,在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);
}

看起来没有办法克服start / wait命令中的错误。很久以前,微软放弃了对预定义命令的支持。

解决方法:PowerShell

只有Cmdlet命令“Start-Process -Wait”按预期的方式对调用的GUI起作用。

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

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

1 个答案:

答案 0 :(得分:0)

[见下面的故事]

<!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>

上面的代码将test.cstest.bat创建到用户的临时文件夹中,然后使用32位.NET v3.5编译器编译C#代码,存在于所有Windows 7中安装(包括64位),然后生成的test.exe启动test.bat,这会导致执行正确等待MMC管理单元(此处services.msc)完成。

<小时/> 的故事

  • 问题不在于GUI /非GUI:各种应用程序(如计算器或任务管理器)会暂停执行命令链,直到它们返回:
    var command="cmd /c echo ZXCV & calc & echo ASDF & pause";
    var command="cmd /c echo ZXCV & taskmgr & echo ASDF & pause";
  • 它与权限提升没有直接关系:
    var command="cmd /c echo ZXCV & diskpart & echo ASDF & pause"; - &#34;通常&#34;它将要求管理员权限并在单独的窗口中运行该工具。从&#34; admin-IE&#34;开始(IE以右键单击,以管理员身份运行),它在同一窗口中有回声和diskpart var command="cmd /c echo ZXCV & fsutil & echo ASDF & pause"; - fsutil不要求提升,&#34;正常&#34;执行会导致错误消息,&#34; admin-IE&#34;得到支持的参数列表
  • 它与提升的GUI可执行文件无关,注册表编辑器工作正常:
    var command="cmd /c echo ZXCV & regedit & echo ASDF & pause";
  • 它似乎与MMC管理单元有关,但是例如资源监视器也会受到影响(虽然它有自己的可执行文件perfmon.exe,但它确实类似于MMC,尤其是在没有任何参数的情况下启动时):<登记/> var command="cmd /c echo ZXCV & perfmon & echo ASDF & pause";
    var command="cmd /c echo ZXCV & services.msc & echo ASDF & pause";
    var command="cmd /c echo ZXCV & start /wait perfmon & echo ASDF & pause";
    var command="cmd /c echo ZXCV & start /wait services.msc & echo ASDF & pause";
    这里没什么关系,直接执行,start /wait,也不是&#34; admin-IE&#34;。
  • 您提到这种链接可以从命令行或批处理文件中运行。所以接下来的想法就是放弃&#39;批处理文件并运行它。因为我很懒,我只是自己创建了这个文件:
    echo ZXCV
    services.msc
    echo ASDF
    pause
    直接运行此批处理文件,等待MMC退出(即使没有start /wait)。但是当通过IE + ActiveX执行时(包括&#34; admin-IE&#34;),
    var command="%USERPROFILE%\\Documents\\NetBeansProjects\\CmdTest\\test.bat";
    它不会等待,直到pause像上面所有其他尝试一样运行。 (为了完整性,它还使用cmd /cstart /wait进行了测试,但它们的存在无关紧要)

我的下一个想法是删除一些微小的.NET代码,比如

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();
  }
}

......然后它奏效了。

当然,所有类型的警告都适用于2018年,IE就是这样,以及ActiveX如何杀死婴儿海豹和毛茸茸的小猫等等。
此外,如果要支持非Win7操作系统,代码可以查看.NET框架的存在并使用现有的框架。另外,由于硬编码test.xy - s可能会伤害某人的眼睛,GetTempName可用于创建非冲突的名称(或单个名称,重复使用不同的扩展名,就像{{1}虽然扩展名必须是.cs,.exe和.bat(也许.cs可能是其他东西,我还没试过)。