how does windows cmd set parser variable names?

When you add the additional spaces, you are effectively telling set to do show the value of a variable called "UNDEFINED " or %UNDEFINED % which is in fact undefined. You can see that the spaces will no longer be a concern if you do set "UNDEFINED" with the spaces after the double quotes. It is the same as doing set UNDEFINED =foo which will not return a variable for %UNDEFINED% bu instead for %UNDEFINED %

Here are examples of this:

set UNDEFINED =foo

when then run, without any additional spaces:

set UNDEFINED The result is as expected.


but when you run it with the additional spaces set UNDEFINED the result no longer matches %UNDEFINED% due to the additional spaces you have given.


Here we can show more how the matching works

set UNDEF=foo
set UNDEFI=foo
set UNDEFIN=foo
set UNDEFINE=foo
set UNDEFINED =foo
set UNDEFINED  =foo
set UNDEFINED   =foo

now see the results of all of these

set UN

and obviously by adding the spaces: set UNDEFINED

but if we add 4 spaces, representing a variable we’ve never set, then we will get un undefined variable result. set UNDEFINED

Finally, to overcome this is to ensure we set variables correctly and double quote them to get the desired results.

set "UNDEFINED=foo"

The latter set command will not care how many spaces you give after the double quotes ended, it will return any variable that has the the word UNDEFINED in it. i.e set "UNDEFINED"

The same goes for results using redirects > or pipe |. Specifically using redirect. everything before the > is seen as the string you want to redirect. Example:

echo foo >out.txt

Will result in out.txt containing foo including the space. Therefore excluding the space is required, but that becomes an issue, should your string end with a number. i.e

echo foo2>out.txt

Which will redirect stderr to file. So we overcome that again, by parenthesizing the code:

(echo foo)>out.txt

Therefore, given your examples, though piping to nul will return no result, unless you specify the type (stdout/stderr)

(SET UNDEFINED)2>nul|more
(SET UNDEFINED)1>nul|more
(SET UNDEFINED)>nul|more


Again. Additional spaces, preceding the strings with spaces, will add spaces to the output. Again using echo

(echo foo | more)>out.txt

There is a space between foo and | if you look at the results in out.txt you will notice the space. The same applies for redirect > Hence the parenthesized blocks used in these instances to eliminate whitespace.


As per the screenshots you have provided. cmd uses the redirect in a way that it does not really care where you place it.

>out.txt echo foo

will result in:


in the file. where adding spaces, will be appended to the file

>out.txt echo foo will result in foo

Similarly to your example, which will echo anything you give in the line to the redirect.

echo foo>out.txt


echo foo>out.txt . will append to the file as redirect is really the key function here where it will append what you give it.

You will however notice that the redirect on its own, then giving the additional spaces before the command will not do this. This is simply because you ask the system to redirect a string to file where the spaces then become the command separators. So this:

>out.txt echo foo will simply result in only foo in your output file.

So.. The best method to ensure we do not add these unwanted whitespace is to do: >out.txt(echo foo)

CLICK HERE to find out more related problems solutions.

Leave a Comment

Your email address will not be published.

Scroll to Top