问题描述
为什么此for循环不适用于带有“!”的文件在文件名中?以及如何使它以“!”识别文件?或其他可能无效的符号。
irc
我收到这样的返回消息,带有!从输出中丢失。
@Echo off
SETLOCAL EnableExtensions EnableDelayedExpansion
set my_dir=C:\Test
set my_ext=txt
cd /d !my_dir!
for %%F in ("*.!my_ext!") do (
for /F "tokens=1,* delims=|" %%K in ('
forfiles /M "%%~F" /C "cmd /C echo @path^|@ext"
') do (
echo "%%~K": %%L
set list=!list!%%~K;
)
)
解决方法
以下是一些可能对您有用的示例:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "my_dir=C:\Test"
Set "my_ext=txt"
CD /D "%my_dir%" 2> NUL || GoTo :EOF
Set "list="
For %%G In ("*.%my_ext%") Do (Echo "%%~fG"^|%%~xG
If Not Defined list (Set "list=%%~fG") Else (
For /F "Tokens=1*Delims==" %%H In ('Set list'
) Do Set "list=%%I;%%~fG"))
SetLocal EnableDelayedExpansion
Echo(!list!
EndLocal
Pause
如果您希望每个文件路径都用双引号引起来,那么您需要做一些小改动:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "my_dir=C:\Test"
Set "my_ext=txt"
CD /D "%my_dir%" 2> NUL || GoTo :EOF
Set "list="
For %%G In ("*.%my_ext%") Do (Echo "%%~fG"^|%%~xG
If Not Defined list (Set "list="%%~fG"") Else (
For /F "Tokens=1*Delims==" %%H In ('Set list'
) Do Set "list=%%I;"%%~fG""))
SetLocal EnableDelayedExpansion
Echo(!list!
EndLocal
Pause
需要特别注意的是,由于每个路径都使用完整路径,因此,用户定义的环境变量的大小限制为32767个字符。这意味着根据%my_dir%
中匹配文件的数量,您可能会超过该最大值。在这两个示例中,如果您确实不需要Echo "%%~fG"^|%%~xG
部分,则可以将其删除。