batch file - HTA & Batch Hybrid, pasando variables de la sección BATCH
batch-file vbscript (1)
Puede acceder a variables de entorno en el tiempo de ejecución de HTA utilizando el objeto de Environment
objeto Wscript.Shell
COM. Puede pasar datos de HTA al subproceso Batch sobre stdout utilizando el método GetStandardStream
Scripting.FileSystemObject
. Aquí hay una demostración de ambos:
<!-- :: 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>
Por lo que vale, también puede acceder a VBScript en un formato híbrido utilizando cscript
mediante kludging una extensión de archivo .wsf. La ventaja, además de deshacerse del breve parpadeo de una ventana de HTA que aparece y desaparece, es que puede pasar argumentos de scripts directamente sin tener que acceder al ámbito de 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>
Y el híbrido Batch + JScript es aún más fácil. También es posible tener tanto el código VBScript como el código JScript como trabajos múltiples con el método .wsf.
Intento escribir un script híbrido batch + hta que me permita pasar variables de la sección de lote del script a la sección hta, de modo que pueda generar cosas como el número de modelo de las computadoras, etc.
Esto es lo que tengo hasta ahora - Lote:
<!-- :: 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
-->
Como puede ver, intenté usar %model%
como parámetro e intenté usar arg1
en mi sección de VBScript para intentar usar esa variable, pero no funcionó.
Entonces en mi sección hta, este es mi vbscript:
<script language="VBScript">
MsgBox arg1
</script>
Lo cual solo abre una caja vacía.
He estado buscando por un tiempo en línea tratando de encontrar una manera de hacer esto y no puedo resolverlo. La forma en que superaba esto antes era básicamente crear un script por lotes que crea un nuevo archivo que es hta & batch hybrid, pero quiero evitar hacerlo por simplicidad.
Cualquier ayuda sería muy apreciada