【问题标题】:Route the path of the script depending on the button pressed mshta.exe vbscript:Execute根据按下的按钮路由脚本的路径 mshta.exe vbscript:Execute
【发布时间】:2016-06-22 21:57:37
【问题描述】:

在批处理文件中,我可以得到以下内容,给我一个带有“确定”按钮的消息框

mshta.exe vbscript:Execute^("msgbox ""Registers NOT submitted""& VbCrLf & VbCrLf &""Tap or click 'Ok' to exit"",vbexclamation,""Please check your internet connection"":close"^)

因此我可以添加是否按钮;

mshta.exe vbscript:Execute^("msgbox ""Registers NOT submitted""& VbCrLf & VbCrLf &""Tap or click 'Ok' to exit"",VBYesNo,""Please check your internet connection"":close"^)

我需要做的是根据他们按下的按钮来路由脚本其余部分的路径 - 是/否。在不引用外部 .vbs 的情况下这是否可行?

非常感谢。

【问题讨论】:

    标签: batch-file vbscript


    【解决方案1】:

    不容易,不。 VBScript 和 JScript 的 HTA 实现都没有提供生成退出代码的本机方式。您可能会找到与 HTA 实例对应的进程对象,然后使用该对象的 .Terminate 方法退出非零(如 this answer 所示);或者可能让 HTA 有条件地写入临时文件或存储注册表值。但所有这些选择都涉及离开优雅的单线世界,您不妨使用hybrid script,它确实可以识别退出非零的命令。

    如果您追求整洁的单行代码,那么使用 PowerShell 可能会更好:

    powershell "add-type -As System.Windows.Forms; exit([windows.forms.messagebox]::show(\"Registers NOT submitted.`n`nDo you want to continue?\",'Warning',4))"
    

    “是”将退出状态 6,“否”将退出状态 7。所以基本上...

    if errorlevel 7 (
        rem // user chose "No"
        exit /b
    ) else (
        rem // user chose "Yes"
        goto begin
    )
    

    [windows.forms.messagebox]::show 方法中的“4”参数可以是以下任意值:

    0 -- OK
    1 -- OK Cancel
    2 -- Abort Retry Ignore
    3 -- Yes No Cancel
    4 -- Yes No
    5 -- Retry Cancel
    

    这些按钮会产生以下退出代码:

    OK = errorlevel 1
    Cancel = errorlevel 2
    Abort = errorlevel 3
    Retry = errorlevel 4
    Ignore = errorlevel 5
    Yes = errorlevel 6
    No = errorlevel 7
    

    【讨论】:

    • 非常感谢您的解决方案和清晰的解释! :)
    【解决方案2】:

    我能想到的唯一方法是使用一个临时文件来保存点击按钮的索引。

    由于这也扩展了 VBScript 部分(由于文件创建代码),我决定将它直接放在批处理代码之后的批处理脚本中。为了识别它,每一行都以// 开头。 (关于行继续 _ 不能在那里使用;像 %TEMP% 这样的环境变量也不能使用。)

    在批处理脚本部分,VBScript 行由findstr /R "^//"for /F 循环读取,VBS​​cript 代码的所有行相互附加,使用分隔符:。 (注意命令行长度限制为 8190 个字符左右,整个 VBScript 不得超过。)

    在执行mshta VBScript:Execute^("!SCRIPT!"^) 命令行后,点击的MsgBox 按钮的索引从临时文件中读取(之后立即删除)。然后显示按钮名称并将ErrorLevel设置为按钮索引,仅用于演示。

    这是完整的代码,包括一些解释性 cmets(使用扩展名 .batcmd 保存):

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    
    rem /* Define constants here: */
    set "BUTTON[1]=OK"
    set "BUTTON[2]=Cancel"
    set "BUTTON[3]=Abort"
    set "BUTTON[4]=Retry"
    set "BUTTON[5]=Ignore"
    set "BUTTON[6]=Yes"
    set "BUTTON[7]=No"
    
    rem /* Read VBScript portion which is everything with leading `//`
    rem    (see the very bottom of this batch file): */
    set "SCRIPT=" & set "SEP="
    for /F "delims=" %%L in ('findstr /R "^//" "%~f0"') do (
        set "LINE=%%L"
        setlocal EnableDelayedExpansion
        set "LINE=!LINE:*//=!"
        set ^"LINE=!LINE:^"=""!^" & rem "
        for /F delims^=^ eol^= %%S in ("!SCRIPT!!SEP!!LINE!") do (
            endlocal
            set "SCRIPT=%%S"
            setlocal EnableDelayedExpansion
        )
        endlocal
        set "SEP=: "
    )
    
    rem /* Execute VBScript here in the parent directory of this batch file;
    rem    this directory is going to contain a temporary text file then: */
    setlocal EnableDelayedExpansion
    cd /D "%~dp0"
    mshta VBScript:Execute^("!SCRIPT!"^)
    endlocal
    
    rem /* Read the button index from the temporary text file and display: */
    < "%~dp0msgbox_return_button.txt" set /P "INDEX="
    del "%~dp0msgbox_return_button.txt"
    call echo Button %%BUTTON[%INDEX%]%% ^(%INDEX%^) has been pressed.
    
    rem /* Set `ErrorLevel` to the button index just as an example: */
    cmd /C exit %INDEX%
    
    endlocal
    exit /B
    
    
    /* VBScript */
    
    //Set objFSO = CreateObject("Scripting.FileSystemObject")
    //Set objTXT = objFSO.CreateTextFile(objFSO.BuildPath(objFSO.GetAbsolutePathName("."), "msgbox_return_button.txt"), True)
    //objTXT.WriteLine(MsgBox("Please let me know:" & vbCrLf & "Is my answer helpful?", vbYesNo + vbQuestion, "StackOverflow"))
    //objTXT.Close
    //Close
    

    【讨论】:

    • 感谢您花时间帮助寻找解决方案 - 非常感谢您花费的时间和麻烦!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2021-12-19
    • 2016-11-07
    相关资源
    最近更新 更多