2012-09-03

Windows Batch Refcard

Syntax, commands, control structures and conventions for Windows batch files. Handy if you want to automate something on your Windows machine. Although, to be honest, the last time I did so seriously was 20 years ago during my civil service.
filename Batch files end with .BAT there is no magical string like in Un*x batch file commands are case insensitive
comments rem at line start is a comment line
in/output redirection cmd <in-file >out-file-new
cmd >>out-file-append
stderr cannot be redirected, always goes to screen.
parameters %1 to %9 arguments number 1 to 9 given to the batch file %* all arguments given to the batch file (max. 9)
environment variables %varname%
conditions if [not] "string1" == "string2" command Enclose vars and strings in "". Idiom for empty check:
if "%var%" == "" command ("" needed for empty string).
if [not] exist filename command
if errorlevel 1 would test for any abnormal exit. errorlevel is the number the last program executed returned. The condition is true if the number is >= the errorlevel. Normal exit returns 0.
logical operators &&execute only when last prog returned ok
||execute only when last prog returned error
skript loops for %% var in ( group ) do command [params]
var wird zu jedem in group angegebenen dateinamen, eg for %%f in (*.*) do type %%f
skript jumps goto mark The target mark itself has to be prepended with : so NT can skip it during execution.
:mark
skript chaining call blah.bat calls another batch like a subroutine, i.e. the current batch's execution is resumed after the other one ends. Recursion possible.
skript messages echo [on|off][message]
@ at line start suppress showing of any single line
@echo off showing of any line (including this). Echo with message prints message.
getting user input for skripts pause[message] halts until any key pressed.
... shift shifts the params in a batch one down, e.g. %9 to %8. %0 is lost and if there were more than 10 params, the current number 11 becomes %9. Example loop with shift
        :next
        if "%0" == "" goto end
                type %0
                shift
        goto next
        :end