Использование SetDelayedExpansion в пакетных файлах: обработка директорий / имен файлов, содержащих! - PullRequest
3 голосов
/ 08 марта 2011

У меня есть два пакетных файла (XP):

test.bat:

setlocal EnableDelayedExpansion

rem check for argument
if [%1]==[] goto :noarg

:arg
rem check for trailing backslash and remove it if it's there
set dirname=%1
IF !dirname:~-1!==\ SET "dirname=!dirname:~0,-1!"

rem find all log files in passed directory and call test2.bat for each one
for /f "tokens=* delims= " %%a in ('dir !dirname!\*.log /s /b') do call test2.bat "%%a"

goto :finish

:noarg
rem prompt for directory to scan
set /p dirname=Type the drive or directory, then hit enter: 

rem loop if nothing entered
if [!dirname!]==[] goto :noarg

rem check for trailing backslash and remove it if it's there
IF !dirname:~-1!==\ SET "dirname=!dirname:~0,-1!"

rem find all log files in passed directory and call test2.bat for each one
for /f "tokens=* delims= " %%a in ('dir "!dirname!"\*.log /s /b') do call test2.bat "%%a"

goto :finish

:finish

test2.bat:

echo %1

Демонстрация проблемы:

-Создайте каталог с именем c: \ test и другой каталог с именем c: \ test!и поместите пустой файл test.log в каждый каталог.

Затем запустите:

test c:\test

Это работает, как и ожидалось (test2.bat повторяет "c: \ test \ test.log")

Теперь запустите:

test c:\test!

Проблема в том, что test2.bat отображает "c: \ test \ test.log" вместо желаемого "c: \ test! \ Test.log")

Я понимаю, это потому что!зарезервировано для использования EnableDelayedExpansion.Но если решение «использовать% раскрытие», то я завис, потому что мне нужно использовать DelayedExpansion (для Обработка конечной обратной косой черты и имен каталогов с пробелами в пакетных файлах )

I 'мы выискивали:

setlocal DisableDelayedExpansion

и

endlocal

и Как мне избежать восклицательного знака!в сценариях cmd?

без удачи (может быть PEBCAK).

Есть мысли?

1 Ответ

2 голосов
/ 08 марта 2011

Проблемы с расширениями% 1 и %% a, с отложенным расширением! удаляется.
Поэтому сначала следует отключить отложенное расширение.
Btw. Удаление косой черты не обязательно (EDIT: только true, если это не корневой путь)

setlocal DisableDelayedExpansion

rem check for argument
if "%~1"=="" goto :noarg

:arg
set "dirname=%~1"

rem find all log files in passed directory and call test2.bat for each one
for /f "tokens=* delims=" %%a in ('dir "%dirname%\*.log" /s /b') do (
  set "file=%%~a"
  setlocal EnableDelayedExpansion
  echo found #!file!#
  call test2.bat "!file!"
  endlocal
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...