6

For example I have such loop that calls dir on a folder whose name contains percent signs so interpreter tries to resolve characters between these as a variable. Such folders are for example common in virtualizing solutions (for example ThinApp), that is data which would be stored in local user AppData is instead written to for example: X:\My Virtualized App\%AppData%.

And of course I know that it is possible to dir through it by doubling the %'s but it is not possible to convince interpreter to not resolve such variable in a for loop, for example:

FOR /F "tokens=*" %%F IN ('dir /b /s X:\myapp\%AppData% ') DO @(
  echo %%F
)

Here no matter what I tried , doubling, quadrupling percents, or adding carets made no difference. The path passed to dir command has resolved appdata and thus is invalid having two drive specifications.

rsk82
  • 28,217
  • 50
  • 150
  • 240

3 Answers3

6

Short course in escaping.

@ECHO OFF &SETLOCAL
FOR /F "delims=" %%F IN ('echo X:\myapp\%AppData%') DO (
  echo %%F
)
FOR /F "delims=" %%F IN ('echo X:\myapp\^^%%AppData^^%%') DO (
  echo %%F
)
FOR /F "delims=" %%F IN ('echo "X:\myapp\^^%%AppData^^%%"') DO (
  echo %%F
)
FOR /F "delims=" %%F IN ('echo ^^"X:\myapp\^%%AppData^%%^"') DO (
  echo %%F
)

Output:

X:\myapp\C:\Users\User\AppData\Roaming
X:\myapp\%AppData%
"X:\myapp\^^%AppData^^%"
"X:\myapp\%AppData%"
Community
  • 1
  • 1
Endoro
  • 37,015
  • 8
  • 50
  • 63
2

try this:

pushd X:\myapp\%%AppData%%
FOR /F "tokens=*" %%F IN ('dir /b /s') DO @(
  echo %%F
)
popd
cure
  • 2,588
  • 1
  • 17
  • 25
1
setlocal
set "AppData="
FOR /F "tokens=*" %%F IN ('dir /b /s "X:\myapp\%%AppData%%"') DO @(
  echo %%F
)
endlocal

or

FOR /F "tokens=*" %%F IN ('dir /b /s "X:\myapp\" ^| find /i "\%%appdata%%\"') DO @(
  echo %%F
)
npocmaka
  • 55,367
  • 18
  • 148
  • 187
  • Ok..This works despite it temporary deletes `%appdata%` variable.So at least I want to know why is the downvote? – npocmaka Nov 28 '13 at 23:06