У меня есть два пакетных файла (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).
Есть мысли?