Batch File Scripting Tips

Here are collected various batch file scripting tips for use when writing .bat files for use with WPKG.

  • If a batch file gives a degree of output to the screen it can overwhelm WPKG and the batch script hang. Lessen the output of commands by appending each with ' 1>NUL 2>NUL'. This will prevent commands echoing their messgaes (from use of the echo command), results and errors to the screen and thus to WPKG. Also, begin a batch script with '@echo off' so that the commands themselves aren't displayed.
  • Where a % character references a variable from within a batch file, where a single % can be used from the command-line a double %% has to be used from within a batch file.
  • The Windows shell and some command-line programs don't like spaces appearing in file or directory names. For example when using such wildcards as %PROGRAMFILES% in %PROGRAMFILES%\some-directory\some-program.exe where we don't know whether or not %PROGRAMFILES% contains a space, use "%PROGRAMFILES%\some-directory\some-program.exe"
  • When batch files check for the existence or not of a directory, using 'if exist' or 'if not exist', if the directory is being checked for on a Windows system then the batch file needs to use '\NUL.ext', if the directory is being checked for on a Linux Samba system (at least Samba 3.2.x) then the batch file needs to use '\NUL'.
  • It is possible to load special variables from registry "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders":
    • It needs gawk (in %SOFTWARE%\bin for the following code)
    • The front and trailing whitespaces are removed ( gsub(/^[ \t]+/, "",$X) and gsub(/[ \t]+$/, "", $X) )
    • The spaces in variable names are removed: "Local Settings" => "LocalSettings"
@echo off

SET QUERY_HIVE=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
SET WPKGBIN=%SOFTWARE%\bin

for /F "usebackq skip=2 delims==" %%G IN (`reg query "%QUERY_HIVE%"`) DO (
REM Possible use of tokens=1,2 to avoid 2 for loops ?
REM  echo %%G | %WPKGBIN%\gawk -F"REG_EXPAND_SZ" "{gsub(/[ \t]+/, \"\", $1);gsub(/[ \t]+$/,\"\",$1);gsub(/^[ \t]+/, \"\", $2);gsub(/[ \t]+$/,\"\",$2);print($1\",\"$2)}"
  for /F "delims=" %%I IN ('echo %%G ^| %WPKGBIN%\gawk -F"REG_EXPAND_SZ" "{gsub(/[ \t]+/, \"\", $1);print($1)}"') DO (
    for /F "delims=" %%J IN ('echo %%G ^| %WPKGBIN%\gawk -F"REG_EXPAND_SZ" "{gsub(/^[ \t]+/, \"\", $2);gsub(/[ \t]+$/,\"\",$2); print($2)}"') DO (
       set %%I=%%J
REM       echo  %%I=%%J
    )
  )
)

To be use like this:

@echo off

IF "%Desktop%" == "" CALL %SOFTWARE%\bin\load-vars.cmd

echo "My Documents are located at %Personal%"