如何防止Windows批处理文件中的for循环中的变量解析(或转义百分号)?

时间:2013-11-28 21:14:39

标签: variables batch-file for-loop

例如,我有这样的循环,在名称包含百分号的文件夹上调用dir,因此解释器会尝试将这些字符之间的字符解析为变量。例如,这些文件夹在虚拟化解决方案(例如ThinApp)中是常见的,即存储在本地用户AppData中的数据被写入例如:X:\ My Virtualized App \%AppData%。

当然我知道可以通过将%加倍来实现它,但是不可能说服解释器在for循环中不解析这样的变量,例如:

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

这里无论我尝试什么,加倍,四倍的百分比,或添加插入符都没有区别。传递给dir命令的路径已经解析了appdata,因此无法使用两个驱动器规范。

3 个答案:

答案 0 :(得分:5)

逃脱的短期课程。

@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
)

输出:

X:\myapp\C:\Users\User\AppData\Roaming
X:\myapp\%AppData%
"X:\myapp\^^%AppData^^%"
"X:\myapp\%AppData%"

答案 1 :(得分:2)

试试这个:

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

答案 2 :(得分:1)

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

FOR /F "tokens=*" %%F IN ('dir /b /s "X:\myapp\" ^| find /i "\%%appdata%%\"') DO @(
  echo %%F
)