1

如何避免延迟扩展删除文件名中的感叹号?

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

1 回答 1

1

正如 Mofi 建议的那样,您可以禁用延迟扩展并使用

call set filesList=%%filesList%%"%%~nxB"

但是当您的文件名中有插入符号时,这会失败。

您的代码中的问题是,FOR 参数只能在没有延迟扩展模式的情况下安全扩展。
通常,您为此使用切换线技术,就像这里一样。

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使用或多或少复杂的技术来传输范围结束的内容,例如
使环境变量在 ENDLOCAL
宏中存活,以跨 endlocal 障碍返回多个变量

于 2018-06-05T09:03:31.883 回答