2017-03-29 31 views
4

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

这是我迄今为止 - 批:

<!-- :: 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%作为参数,我试图用我的arg1 VBScript部分尝试使用该变量 - 但它不起作用。

所以在我的HTA节,这是我的VBScript:

<script language="VBScript"> 

    MsgBox arg1 

</script> 

刚刚打开一个空箱子。

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

任何帮助将使用Wscript.Shell COM对象的Environment对象非常感激

回答

5

您可以访问在HTA运行时的环境变量。您可以通过使用Scripting.FileSystemObjectGetStandardStream方法将数据从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由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> 

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

+0

绝对惊人,非常感谢你 – GrumpyCrouton