批处理:for文件循环问题,名称中带有符号

问题描述

为什么此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部分,则可以将其删除。