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

Batch file 如何将退出状态从HTA(vbscript)返回到调用批处理文件,batch-file,vbscript,hta,Batch File,Vbscript,Hta,如何将退出状态从HTA(vbscript)返回到调用批处理文件 我的批处理文件代码 @echo关闭 回声配置测试。。。 调用AppConfigurationEditor.hta 调用TestConfigurationEditor.hta 1.如果用户单击第一个HTA上的取消按钮,我不想运行第二个HTA 2.批处理脚本立即调用/显示第二个HTA,不要等到第一个HTA关闭。@echo OFF 回声配置测试。。。 启动/等待“”AppConfigurationEditor.hta 回显%errorl

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

我的批处理文件代码

@echo关闭
回声配置测试。。。
调用AppConfigurationEditor.hta
调用TestConfigurationEditor.hta
1.如果用户单击第一个HTA上的取消按钮,我不想运行第二个HTA

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

@echo OFF
回声配置测试。。。
启动/等待“”AppConfigurationEditor.hta
回显%errorlevel%
如果%errorlevel%==0,请调用TestConfigurationEditor.hta
应完成作业-如果
errorlevel
返回0表示正常终止,其他返回表示“已取消”

echo%errorlevel%
行只是用来测试的,只是告诉您发生了什么


start/wait
将启动目标,并暂停批处理,直到过程完成。额外的一对兔子耳朵实际上包含了新的窗口标题-这里多余,但最好保留为
start
,否则从目标中选取第一个带引号的字符串(如果有)作为窗口标题。

您必须将按下按钮的结果返回为
退出代码
,该结果可以在
错误级别
中恢复,在两个Hta代码中使用
Wscript.Quit[Value]
(如果您只想检查第一个,则返回第一个)

例如:

Test.vbs

result=Msgbox("Are you sure?",vbokcancel, "")
WScript.Quit result
runtest.bat

@echo off&cls
cscript Test.vbs
if %errorlevel% Equ 1 Echo Process OK
if %errorlevel% Equ 2 Echo Process canceled

HTA没有实现将errorlevel返回给调用方进程的方法

无法使用WScript.Quit。语言引擎vbscript/javascript/。。。相同,但实例化引擎的主机对象不是常用的windows脚本主机,而是浏览器对象,因此
WScript
对象不存在

窗口。关闭
方法无法使用。它可以关闭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>

感谢Mango,让我知道如何等待,直到收到第一个进程的响应。我更喜欢这个表格。用于测试错误级别。也就是说,还有另一种形式:
if%errorlevel%1 echo dah
。不过要小心使用。它总是生成大于或等于的文本。因此,如果使用该表单,您可能会选中%errorlevel%3以排除3或更高,然后选中%errorlevel%2以捕获2,然后选中%errorlevel%1以捕获1。抓住你了errorlevel%equ 1不同。
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
)