HTA和Batch Hybrid,从BATCH部分传递变量

Gru*_*ica 4 vbscript cmd batch-file hta

我正在尝试编写一个批处理+ hta混合脚本,它允许我将变量从脚本的批处理部分传递到hta部分,这样我就可以生成像计算机型号等的东西.

这是我到目前为止 - 批次:

<!-- :: Batch section
    @echo off
    Pushd "%~dp0"
    setlocal

    FOR /F "tokens=2 delims='='" %%A in ('wmic ComputerSystem Get Model /value') do SET model=%%A

    for /F "delims=" %%a in ('mshta.exe "%~F0" "%model%"') do set "HTAreply=%%a"
    echo End of HTA window, reply: "%HTAreply%"
    goto :EOF
    -->
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我尝试将其%model%用作参数,并尝试arg1在我的VBScript部分中尝试使用该变量 - 但它不起作用.

所以在我的hta部分中,这是我的vbscript:

<script language="VBScript">

    MsgBox arg1

</script>
Run Code Online (Sandbox Code Playgroud)

这只是打开一个空盒子.

我一直在寻找一段时间在线试图找到一种方法来做到这一点,我无法弄明白.我之前解决这个问题的方法基本上是创建一个批处理脚本来创建一个新文件,即hta和batch hybrid,但我想避免为了简单起见而这样做.

任何帮助将非常感激

roj*_*ojo 6

您可以使用Wscript.ShellCOM对象的Environment对象访问HTA运行时中的环境变量.您可以使用在标准输出的数据传递从HTA回批量线程Scripting.FileSystemObjectGetStandardStream方法.以下是两者的演示:

<!-- :: Batch section
@echo off & setlocal
Pushd "%~dp0"

FOR /F "tokens=2 delims==" %%A in ('wmic ComputerSystem Get Model /value') do SET model=%%A

for /F "delims=" %%a in ('mshta.exe "%~f0"') do set "HTAreply=%%a"
echo End of HTA window, reply: "%HTAreply%"
goto :EOF
-->
<script language="VBScript">

    Set Env = CreateObject("Wscript.Shell").Environment("Process")
    Set StdOut = CreateObject("Scripting.FileSystemObject").GetStandardStream(1)

    MsgBox Env("model")
    StdOut.Write("response")

    Set Env = Nothing
    Set StdOut = Nothing

    close()

</script>
Run Code Online (Sandbox Code Playgroud)

对于它的价值,你也可以cscript通过kludging伪装.wsf文件扩展名以混合格式访问VBScript .除了消除出现和消失的HTA窗口的短暂闪烁之外,优点是您可以直接传递脚本参数而无需访问Environment("Process")范围.

<!-- : batch portion
@echo off & setlocal

FOR /F "tokens=2 delims==" %%A in ('wmic ComputerSystem Get Model /value') do SET model=%%A

for /F "delims=" %%a in ('cscript /nologo "%~f0?.wsf" "%model%"') do set "VBreply=%%a"
echo End of VB script, reply: "%VBreply%"

goto :EOF

: VBScript -->
<job>
    <script language="VBScript">
        model = WScript.Arguments(0)

        MsgBox model
        Wscript.Echo "response"
    </script>
</job>
Run Code Online (Sandbox Code Playgroud)

混合批次+ JScript中更容易.使用.wsf方法也可以将VBScript和JScript代码作为多个作业.