I’m writing a simple .bat file and I’ve run into some weird behavior. There are a couple places where I have to do a simple if/else, but the code inside the blocks don’t seem to be working correctly.
Here’s a simple case that demonstrates the error:
@echo off set MODE=FOOBAR if '%~1'=='' ( set MODE=all echo mode: %MODE% ) else ( set MODE=%~1 echo mode: %MODE% ) echo mode: %MODE%
The output I’m getting is:
C:\>test.bat test mode: FOOBAR mode: test
Why is the echo inside the code block not getting the new value of the variable? In the actual code I’m writing I need to build a few variables and reference them within the scope of the if/else. I could switch this to use labels and gotos instead of an if/else, but that doesn’t seem nearly as clean.
What causes this behavior? Is there some kind of limit on variables within code blocks?
You are running into the problem of cmd’s static variable expansion. The MODE variable is only evaluated once. You can see this if you omit the @echo off line.
From the set /? documentation: