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

时间:2018-06-05 01:41:11

标签: batch-file delayedvariableexpansion

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

@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

1 个答案:

答案 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

相关问题