如何避免延迟扩展删除文件名中的感叹号?
@echo off
Set path="C:\example"
Set chars=a b c
cd /d %path%
setlocal EnableDelayedExpansion
for %%A in (%chars%) do (
set filesList=
for /F "tokens=* delims=" %%B in ('dir %%A^* /a-d /b') do (
set filesList=!filesList!"%%~nxB"
)
if not "!filesList!"=="" (
echo %%A filesList: !filesList!
)
)
endlocal
答案 0 :(得分:1)
正如Mofi建议的那样,您可以禁用延迟扩展并使用
call set filesList=%%filesList%%"%%~nxB"
但是当文件名中有插入符号时,这会失败。
您的代码中存在的问题是,FOR参数只能在没有延迟扩展模式的情况下安全地扩展 通常你会使用toggline技术,就像这里一样。
setlocal DisableDelayedExpansion
for /F "delims=" %%B in ('dir %%A^* /a-d /b') do (
set "line=%%B"
setlocal EnableDelayedExpansion
REM *** Process the content of line here
echo !line!
endlocal
)
但这只有在您不需要将line
的内容从(内部)setlocal范围中转移出来时才有效。
在您的情况下,您尝试将line
内容添加到范围之外的filesList
变量中。
对于这种情况,您需要使用或多或少的复杂技术在范围末端传输line
的内容,例如
Make an environment variable survive ENDLOCAL
Macro to return multiple variables across endlocal barriers