我正在尝试编写一个批处理+ 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.FileSystemObject
的GetStandardStream
方法通过stdout将数据从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>
对于它的值(value),您还可以通过混入假装的.wsf文件扩展名,使用
cscript
以混合格式访问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作为多个作业。
关于batch-file - HTA和批处理混合,从BATCH部分传递变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43105028/