Strange Syntax for Variable Definition
My quickie script to export Oracle tables defined the for command variable using two percent symbols, %%i, instead of the expected %i% in Windows command shell. Even more strange is that only one % is required when the for command is written interactively in the command shell.
To demonstrate and understand how variables are defined in cmd, try the following script in a batch file (i.e. save the commands in a file and run it) and interactively (i.e. type in each command). Note that homedrive is an pre-defined environment variable while i is not defined.
echo %homedrive echo %i echo %homedrive% echo %i% echo %%homedrive% echo %%i% echo %%homedrive%% echo %%i%%
Here's the results of using a batch script:
> echo homedrive homedrive > echo i i > echo C: C: > echo ECHO is on. > echo %homedrive %homedrive > echo %i %i > echo %homedrive% %homedrive% > echo %i% %i%
Here's what happens when you enter these commands one at a time:
> echo %homedrive %homedrive > echo %i %i > echo %homedrive% C: > echo %i% %i% > echo %%homedrive% %C: > echo %%i% %%i% > echo %%homedrive%% %C:% > echo %%i%% %%i%%
When cmd reads a script in batch mode, it always consumes the leading % for each string as it looks for variables or has to escape a % (see %%i). If a
variable is found, that string is always replaced, even if it is not defined (see echo %i%).
On the other hand, when cmd processes a command interactively, it only consumes the %'s in a string when that string is delimited by % (compare echo %homedrive and echo %homedrive%) and if that string maps to a variable name (compare echo %homedrive% and echo %i%). Also, % by itself is treated as a literal "%".
Back to the for command from the start of this article. In a batch script, a variable, %i, for the for command has to be entered as %%i so that cmd will replace %% with just %. In interactive mode, you only need %i because cmd does not regard this string as a variable. So here's the batch script version of a for command …
for %%i in (a, b, c) do echo %%i
… while here's the interactive version of a for command …
for %i in (a, b, c) do echo %i
The for command defines a variable only if a string starts with %. If you use %i%, then cmd replaces it with a value if i is defined (as expected) and you may encounter some other unexpected error depending on the value of i. However, if i is not defined, for command exits with this message:
%i% was unexpected at this time.
Another unexpected limitation of the for command is that a variable can be only one character long. If you try a variable name that is two or more characters long, you will get this …
for %xy in (a, b, c) do echo %xy %xy was unexpected at this time.