batch-file
Híbridos por lotes y VBS
Buscar..
Introducción
Batch
son capaces de ejecutarse con la funcionalidad VBS
, lo que aumenta aún más su confiabilidad. Por ejemplo, VBS
puede lidiar con decimales, espacios y algunas otras operaciones avanzadas que no se pueden realizar por batch
. También es capaz de trabajar con objetos WMI y ActiveX.
Ejecutar VBS con archivo (s) temporal (s)
El método de la vieja escuela para ejecutar otra secuencia de comandos de un batch
es hacer echo
la secuencia de comandos en otra ubicación, y luego ejecutarlo.
Este método se puede representar así:
@echo off
rem VBS below
echo your vbs > TempVBS.vbs
echo other vbs>>TempVBS.vbs
rem End of VBS
cscript //nologo TempVBS.vbs
del /f /s /q TempVBS.vbs
El método anterior requeriría mucho echo (vbs) >> TempVBS.vbs
, así que aquí hay una manera de acortarlo. (código de Aacini)
@echo off
setlocal
rem Get the number of the "<resource>" line
for /F "delims=:" %%a in ('findstr /N "<resource>" "%~F0"') do set "start=%%a"
rem Skip such number of lines and show the rest of this file
(for /F "usebackq skip=%start% delims=" %%a in ("%~F0") do echo %%a) > Program.vbs
cscript //nologo Program.vbs
del /f /s /q Program.vbs
exit /b
<resource>
your vbs
another line of vbs
El último método es mediante el uso de streams
. Un archivo puede tener algunas secuencias. Y cada flujo puede contener información diferente.
@echo off
echo vbs >%0:stream1
rem This command redirect "vbs" into the stream1 of this script, then we can call it later
cscript %0:stream1 //nologo
rem if you like, you can clear the stream1 of this file by:
type nul>%0:stream1
Incruste código vbscript en un archivo por lotes sin usar archivos temporales
Aquí hay un ejemplo con la técnica (hack) inventada por el usuario Liviu de los foros de dostips :
@echo off
echo Printed by CMD.EXE
cscript //nologo "%~f0?.wsf" //job:JS //job:VBS
exit /b %errorlevel%
----END OF BATCH CODE---
<package>
<job id="JS">
<script language="VBScript">
WScript.Echo("Printed by VBScript"):
</script>
</job>
<job id="VBS">
<script language="JScript">
WScript.Echo("Printed by JScript");
</script>
</job>
</package>
Dado que la ejecución del archivo wsf
con el host del script de Windows es sensible a la extensión, puede ejecutar un archivo con cualquier extensión agregando ?.wsf
al final del archivo (que es el núcleo del hack). Si bien el ejemplo de Liviu es probablemente más robusto, el código anterior es una versión más simplificada. Como a wsh no le importan las cosas que están fuera del nodo <package>
no está obligado a poner todo en comentarios xml. Aunque hay que tener cuidado con los símbolos de redirección ( <
y >
)