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

HTA & Batch Hybrid, passing variables from BATCH section

我正在尝试编写一个批处理 + 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
    -->

如您所见,我尝试使用 %model% 作为参数,并且我尝试在我的 VBScript 部分中使用 arg1 来尝试使用该变量 - 但它没有用。

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

<script language="VBScript">

    MsgBox arg1

</script>

这只会打开一个空框。

我已经在网上搜索了一段时间,试图找出一种方法来做到这一点,但我无法弄清楚。我之前解决这个问题的方法基本上是创建一个批处理脚本来创建一个新文件,该文件是 hta 和批处理的混合体,但为了简单起见,我想避免这样做。

如有任何帮助,我们将不胜感激

您可以使用 Wscript.Shell COM 对象的 Environment 对象访问 HTA 运行时中的环境变量。您可以使用 Scripting.FileSystemObjectGetStandardStream 方法通过标准输出将数据从 HTA 传回 Batch 线程。下面是两者的演示:

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

对于它的价值,您还可以使用 cscript 通过假装的 .wsf 文件扩展名访问混合格式的 VBScript。除了摆脱 HTA window 出现和消失的短暂闪烁之外,优点是您可以直接传递脚本参数而无需访问 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>

hybrid Batch + JScript is even easier. It's also possible to have both VBScript and JScript code 使用 .wsf 方法作为多个作业。