Windows user defined environment variable names can contain any character except =.
Special characters can be included by escaping them. A simpler method is to simply enclose the entire SET expression within quotes. For example:
set "A weird & "complex" variable=My value"
set A weird ^& "complex" variable=My value
Both expressions above give the same result. The variable name is A weird & "complex" variable and the value is My value
The IF DEFINED construct is used to test if a variable is defined. Quotes don’t work for this test, special characters in the name (including quotes) must be escaped.
set "A&B=value"
if defined A^&B echo This works
if defined "A&B" echo This does not work
The above escaped test works just fine. The quoted test does not work
But how can I test if a variable containing spaces exists?
set "A B=value"
if defined A^ B echo this does not work!
It seems like the above should work, but it doesn’t!
I’m looking for an answer that does NOT involve expanding the variable using %A B% or !A B!
Interessting question (I love this syntax base questions).
Obviously you know how to check it with delayed expansion and also FOR-parameters works.
In my opionion, in the escape2 example the parser first split the line into tokens this way:
<if> <defined> <AAA BBB> <echo ....But at the execution time of the if defined it rescan the
<AAA BBB>token so it only gets theAAA.You can’t inject a second escape like
AAA^^^ BBBas this only searches for the variable namedAAA^I can’t see a solution without delaying/FOR, as the escaping of the space always fails.
EDIT: It can also be solved with
SET <varname>The solution of ijprest uses the SET command to test the variable without the need of escaping the varname.
But it also shows interessting behaviour with spaces inside and at the end of a varname.
It seems to follow these rules:
SET varnamesearches for all variables beginning with varname, but first it removes all characters after the last space character of varname, and it removes all leading spaces.So you can’t search for variables with beginning with space (but it is also a bit tricky to create such a varname).
The same behaviour is also active if the variablename is enclosed into quotes, but then exists one more rule.
First remove all characters after the last quote, if there are at least two quotes.
Use the text inside of the quotes, and use the “space”-rule.
Sample.