Как избежать отложенного расширения, удаляя восклицательные знаки в именах файлов?

Как избежать отложенного расширения, удаляя восклицательные знаки в именах файлов?

@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 ответ

Решение

Как предложил 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
Макрос для возврата нескольких переменных через эндокальные барьеры

Другие вопросы по тегам