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

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

@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 голосов
/ 05 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...