Recently, I had some tasks at work that required me to write a lot of batch files.
Here are some things about batch files that I either learned or re-discovered in the process:
Don’t use blanks when assigning values to variables
This does not work (no error message -
%foo% is just empty afterwards):
set foo = bar
This one took me some time to figure out. I’m used to Visual Studio and the Access VBA editor, which both automatically insert these blanks into my code if I don’t do it myself. So when I wrote batch files with a simple text editor, I inserted these blanks too, without thinking.
Execute .exe and save the output to a variable
This line saves the output of
foo.exe to a variable named
for /f "tokens=*" %%i in ('path\to\foo.exe') do set bar=%%i
(Credits for this go to user “lesmana” at Stack Overflow)
Disclaimer: I don’t try to understand it, I just copy/paste it every time I need it.
(The whole usage of the
for command looks equally complicated - to see it in all its beauty, type
for /? and read the help.)
Get the path and file name of the currently running batch file
There are other commands to get more file information, but to me the most important ones are these:
%~dp0outputs the path of the current batch file
%~nx0outputs the name of the current batch file
To see it in action, put this into a batch file:
echo %~dp0 echo %~nx0
When the batch file is
c:\test.bat, it will output this:
The number zero at the end of
%~nx0 refers to
%0, which is the currently executing batch file.
Likewise, if you pass a file as parameter
%1, you can get the name of that file by using
%~nx1 instead of
%~nx0 are actually combined commands (you can also use
%~n0 to get just the file name without extension, and
%~x0 to get just the extension)
To see the complete list of commands, open the command line and type in
Temporarily add a folder to the
When you need to refer files from a certain folder in a batch file several times and you don’t want to copy/paste the complete path every time, you can just add the folder to the
When you don’t want to (or aren’t allowed to) do this permanently on the machine, you can set the
%PATH% variable in the batch file, which lasts only for the execution time of the batch file.
The following line appends
c:\foo to the existing content of the
%PATH% variable contains everything it contained before plus
c:\foo, which is probably what you want.
A second (but inferior) way would be:
This is probably not what you want, because it replaces the whole content of the
%PATH% variable by
In other words,
%PATH% will only contain
Beware: you won’t notice the difference as long as you only need files from
But as soon as you need some other command-line tool like
hg (or some Windows helper like
regsvr32.exe), your batch file won’t find them anymore because you just deleted their locations from the
Variables are global in nested batch file calls
Take a look at these two batch files:
set var=foo call batch2.bat echo %var%
The first batch file calls the second one, so variables with the same name are shared between the two.
This means that the last line in the first batch file (
echo %var%) will output
bar and not