Как избежать отложенного расширения, удаляя восклицательные знаки в именах файлов?
Как избежать отложенного расширения, удаляя восклицательные знаки в именах файлов?
@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
Макрос для возврата нескольких переменных через эндокальные барьеры