Batch File Scripting Tips
From WPKG | Open Source Software Deployment and Distribution
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%"