batch-file
Batch- och VBS-hybrider
Sök…
Introduktion
Batch
kan köras med VBS
funktionalitet, vilket ytterligare ökar deras tillförlitlighet. Till exempel kan VBS
hantera decimaler, mellanslag och vissa andra avancerade operationer som inte kan utföras i batch
. Kan också arbeta med WMI och ActiveX-objekt.
Kör VBS med tillfälliga filer
Den gamla skolmetoden för att köra ett annat skript från batch
är att echo
skriptet till en annan plats och sedan köra det.
Den här metoden kan representeras på följande sätt:
@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
Metoden ovan kräver massor av echo (vbs) >> TempVBS.vbs
, så här är ett sätt att förkorta det. (kod av 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
Den sista metoden är att använda streams
. En fil kan ha några strömmar. Och varje ström kan innehålla annan information.
@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
Bädda in vbscript-kod i batchfilen utan att använda tillfälliga filer
Här är ett exempel med tekniken (hack) uppfann av dostipsforums användare Liviu:
@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>
Eftersom köra wsf
fil med Windows-skriptvärd är förlängningskänslig kan du köra en fil med vilken förlängning som helst genom att lägga till ?.wsf
i slutet av filen (som är kärnan i hacket). Medan Liviu-exemplet förmodligen är mer robust är koden ovan en mer förenklad version. Eftersom wsh inte bryr sig mycket om sakerna utanför <package>
-noden, är du inte skyldig att lägga allt i xml-kommentarer. Även om det är att vara försiktig med omdirigeringssymboler ( <
och >
)