Underused features of Windows batch files

StackOverflow have another interesting topic about: Underused features of Windows batch files.

Of course there are many things I didn’t know about. Some highlights:

PUSHD path
Takes you to the directory specified by path.
Takes you back to the directory you “pushed” from.

By using CALL, EXIT /B, SETLOCAL & ENDLOCAL you can implement subroutines with local variables.


@echo off

set x=xxxxx
call :sub 10
echo %x%
exit /b

set /a x=%1 + 1
echo %x%
exit /b

This will print


even though :sub modifies x.

Creating an empty file:

> copy nul filename.ext

The equivalent of the bash (and other shells)

echo -n Hello # or
echo Hello\\c

which outputs “Hello” without a trailing newline. A cmd hack to do this:

<nul set /p any-variable-name=Hello

set /p is a way to prompt the user for input. It emits the given string and then waits, (on the same line, i.e., no CRLF), for the user to type a response.

<nul simply pipes an empty response to the set /p command, so the net result is the emitted prompt string. (The variable used remains unchanged due to the empty reponse.)

Problems are: It’s not possible to output a leading equal sign, and on Vista leading whitespace characters are removed, but not on XP.

Command separators:

cls & dir
copy a b && echo Success
copy a b || echo Failure

At the 2nd line, the command after && only runs if the first command is successful.

At the 3rd line, the command after || only runs if the first command failed.

Doesn’t provide much functionality, but you can use the title command for a couple of uses, like providing status on a long script in the task bar, or just to enhance user feedback.

@title Searching for …
:: processing search
@title preparing search results
:: data processing

And there are many more. If you want to learn something new, this topic is must have reading!