Batch File Tips and Tricks
A collection of some useful snippets for batch files.
Controlling batch file output
To stop every line of the batch file being output to the command prompt put this at the top of the batch file, this makes for a less noisy output.
@echo off
Echo the output of a command, useful for logging what the batch file is actually doing.
for /f %%i in ('dir') do echo %%i
Working with variables
Store the output of a command as a variable to be used elsewhere in the batch file. Normally for /f
on its own would loop the output word by word using whitespace as a delimiter, by adding tokens=*
we make it loop the output line by line. Note as we're looping line by line the variable will be set to the value of the last line
for /f "tokens=*" %%i in ('cd') do set current_directory=%%i
echo %current_directory%
However there is a better way to query the current working directory than the previous example, use the built in variable %cd%
.
set current_directory=%cd%
Invoking other batch files
To invoke a second batch file from inside a batch file without ending the execution when the second batch file is finished.
call other.bat
One problem with calling other batch files is that we may not be in the directory we think we are in, the batch file may have been invoked from a different directory to the one it is located in. To work around this we can wrap calls to other relative batch files with a push and pop of the current batch files directory.
pushd %~dp0
call other.bat
popd
Or just append the current batch files directory to the relative batch file's name.
call %~dp0other.bat
Simulating functions
Another use of call
is to combine it with goto
and mimic the behaviour of functions within batch files.
goto post_functions
:hello_world
echo hello world!
exit /b 0
:post_functions
call :hello_world
Easier debugging
To stop the command window from closing immediately when done only after double clicking a batch file.
@echo %cmdcmdline% | findstr /l "\"\"" >NUL 2>&1
if %errorlevel% EQU 0 pause
This checks if the command line used to invoke the batch file was a call to explorer, %cmdcmdline%
would look something like C:\Windows\system32\cmd.exe /c ""D:\example.bat" "
. This code above looks for the double quotes just before the file path.