Tips for Golfing in Batch Windows Batch (CMD) is probably the least suitable language for code golfing.

Avoid newline characters. If you're looking for the shortest code in bytes, as opposed to characters, you will want to get rid of all unnecessary carriage returns (newline characters = 2 bytes). You can use the &amp; operation to do this, trimming one byte for each command.

echo Hello&amp;echo World.


Setting variables. When setting variables using switches, the set parser will ignore spaces.

set /a a+=1
set /p b="User Input: "
:: Will be handled the same as..
set/aa+=1
set/pb="User Input: "


Note that the same parser rules do not apply to all commands - as an example, for loops require spaces. Except between the set, string, or command (i.e. what is inside the brackets) and the word do.

for /f %%a in (file.txt)do ...


Simple mathematical expressions. Also, notice the expression that I used for incrementing in the set /a command. For simple mathematical expressions use += -= *= /= instead of (for example) set /a a=%a%+1.

Gathering command output. To get the output of a command, it can sometimes be useful to output to and read from a file, where you otherwise might have used a for loop to gather the output:

for /f %%a in ('echo test') do set a=%%a
:: Can be shortened to
echo test&gt;f&amp;set/pa=&lt;f


echo test send stdout to a file called f, &gt;f, start a new command &amp; and get the contents of the file in a variable set/pa=&lt;f. Obviously this isn't always useful. But it can be when all you need is a single line of output.

Command output. When suppressing command output, use @ before the commands, unless you need to suppress more than 9 commands, in which case, use @echo off at the start of your script. @echo off is 9 bytes long, and therefore will generally save more bytes with longer scripts.

Commands often do more than just what is obvious - think about what your commands are doing. For example; if you need to set a variable and echo another variable, instead of:

set a=OUTPUT
echo %a%
echo test&gt;f
set /p b=&lt;f


You can use the set command with the /p switch to output %a% for you.

set a=OUTPUT
echo test&gt;f
set /p b=%a%&lt;f


Completely golfed...

set a=OUTPUT&amp;echo test&gt;f&amp;set/pb=%a%&lt;f


A couple of expamples - Count sum of all digits - Goldbach&#39;s conjecture.

Any other tips are more than appreciated - I'll keep updating this if I think of anything else.
Counters

Whenever you have a variable that will act as a counter starting from 0 you might want to write

set count=0
set/acount+=1


; however, you can eliminate the first lines because whenever set/a is used with an unset variable its value is assumed to be 0  

set/acounter+=1


Code Blocks

There a number of ways you can shave off a few bytes when you have to used blocks of code.

Whenever you open a code block, you do not need to insert a line break before the first line of code in that block. The closing parentheses does not have to be on a line of its own either.

If %a%==%b% (
     echo true
) else (
    echo false
)


can be golfed to

If %a%==%b% (echo true)else (echo false)


Printing Without Trailing New Line

The common pattern for this is 

echo|set/p=text


but, you can save 2 bytes changing echo to cd

cd|set/p=text