【问题标题】:HTA & Batch Hybrid, passing variables from BATCH sectionHTA & Batch Hybrid,从 BATCH 部分传递变量
【发布时间】:2017-03-30 21:45:03
【问题描述】:

我正在尝试编写一个批处理 + 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 和批处理混合文件,但为了简单起见,我想避免这样做。

任何帮助将不胜感激

【问题讨论】:

    标签: batch-file vbscript cmd hta


    【解决方案1】:

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

    <!-- :: 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 访问混合格式的VBScript,方法是包含一个假装的.wsf 文件扩展名。除了摆脱 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>
    

    hybrid Batch + JScript 更容易。也可以使用 .wsf 方法将 both VBScript and JScript code 作为多个作业。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 2016-09-14
      • 2017-03-28
      • 2020-03-10
      • 1970-01-01
      相关资源
      最近更新 更多