batch-file - 如何将退出状态从 HTA (vbscript) 返回到调用批处理文件

标签 batch-file vbscript hta

如何将退出状态从 HTA (vbscript) 返回到调用批处理文件?

我的批处理文件代码

@echo OFF
echo Configuring Test...
call AppConfigurationEditor.hta
call TestConfigurationEditor.hta

1.如果用户在第一个 HTA 上单击“取消”按钮,我不想运行第二个 HTA。

2.批处理脚本立即调用/显示第二个 HTA,而不是等到第一个 HTA 关闭。

最佳答案

HTA 没有实现向调用进程返回错误级别的方法。

WScript.Quit 无法使用。语言引擎vbscript/javascript/...是一样的,但是实例化引擎的宿主对象不是习惯性的windows脚本宿主,而是浏览器对象,所以WScript对象是不存在的。

window.close 方法无法使用。它可以关闭hta,但不会给出返回值。

使用 hta 向调用进程返回值的通常方法是将此值保存在文件或注册表中。然后调用进程可以检索所需的值。

如果需要errorlevel,没有直接的方法。但是可以实现间接方法。只需使用 WMI 检索正在运行的进程列表,找到当前的 hta,并为此进程调用允许设置退出值的 Terminate 方法。

<HTML>
    <HEAD>
        <HTA:APPLICATION 
            ID              = "testCloseHTA" 
            APPLICATIONNAME = "testCloseHTA"
            VERSION         = "0.1"
            NAVIGABLE       = "yes"
            SHOWINTASKBAR   = "yes" 
            SINGLEINSTANCE  = "yes" 
            WINDOWSTATE     = "normal"

            BORDER          = "normal" 
            BORDERSTYLE     = "normal"
            INNERBORDER     = "no" 

            CAPTION         = "yes" 
            MINIMIZEBUTTON  = "yes"
            MAXIMIZEBUTTON  = "yes"
            SYSMENU         = "yes" 
            SCROLL          = "yes" 
            SCROLLFLAT      = "yes"

            CONTEXTMENU     = "yes"
            SELECTION       = "yes"
        />

        <TITLE>testCloseHTA</TITLE>

        <STYLE>
            body { font-size: 1em; font-family:Verdana; }
        </STYLE>

        <SCRIPT language="Javascript">
            function closeWithErrorlevel(errorlevel){
                var colProcesses = GetObject('winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2').ExecQuery('Select * from Win32_Process Where Name = \'mshta.exe\'');
                var myPath = (''+location.pathname).toLowerCase();
                var enumProcesses = new Enumerator(colProcesses);
                for ( var process = null ; !enumProcesses.atEnd() ; enumProcesses.moveNext() ) {
                    process = enumProcesses.item();
                    if ( (''+process.CommandLine).toLowerCase().indexOf(myPath) > 0 ){
                        process.Terminate(errorlevel);
                    }
                }
            }

            function closeHTA(value){
                // test close of window. Use default value
                if (typeof value === 'undefined') value = 0; 
                try { closeWithErrorlevel(value) } catch (e) {};
            }

        </SCRIPT>

    </HEAD>

    <BODY>
        <button onclick="closeHTA(0);">close application 0</button>
        <button onclick="closeHTA(1);">close application 1</button>
        <button onclick="closeHTA(2);">close application 2</button>
    </BODY>

    <script language="Javascript">
            window.attachEvent('onbeforeunload',closeHTA);
    </script>

</HTML>

然后你可以从批处理文件中调用它

start "" /wait testCloseHTA.hta
if errorlevel 2 (
    echo option 2 has been selected
) else if errorlevel 1 (
    echo option 1 has been selected
) else (
    echo option 0 has been selected
)

关于batch-file - 如何将退出状态从 HTA (vbscript) 返回到调用批处理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20818111/

相关文章:

windows - 如何在批处理文件脚本中循环打印程序的返回值?

windows - 批处理参数 %~s1 给出了错误的 8.3 短名称

node.js - Nodejs应用程序无法识别之前设置的批处理环境变量

windows - 如何批量获取文件夹的大小(以字节为单位)

hta - 更改 HTA 应用程序窗口大小

debugging - 如何调试 IE9 HTA?

excel - VB 脚本运行时错误 : Object Required: 'Active Cell'

arrays - For Next 循环中每次迭代 VBS 中的新数组

http - VBS中以post形式上传文件

javascript - 无法使用 JavaScript 在 .hta 中调用curl