
У меня есть скрипт, который рекурсивно загружает файлы из определенного каталога (и подкаталогов) в java classpath с помощью цикла FOR. Выглядит это так:
ДЛЯ /ркаталог%%F В (*.jar) ДЕЛАТЬ вызов :addcp %%F
К сожалению, теперь мне нужно исключить определенный подкаталог из результатов (я не хочу, чтобы некоторые файлы jar загружались). Я пробовал вложить оператор IF внутрь цикла FOR, но безуспешно.
Изменение языков скриптов, к сожалению, не вариант, а итерация каждого подкаталога станет кошмаром обслуживания. Есть ли у кого-нибудь способ сделать это?
Я попробовал что-то вроде:
ДЛЯ /ркаталог%%F IN ( *
.jar) DO IF %%F== *
string *
DO call :addcp %%F
но это не сработало.
решение1
Вот скрипт для дампа списка абсолютных путей всех EXE-файлов в "%ProgramFiles%", за исключением тех, которые находятся в подкаталоге "Windows NT". Я думаю, вы, вероятно, могли бы обойти это в представлении того, что вы ищете.
@echo off
for /f "usebackq delims=" %%i in (`dir "%ProgramFiles%\*.exe" /s /a /b`) do call :checkit "%%i"
goto end
:checkit
echo %1 | find /i "%ProgramFiles%\Windows NT\" >NUL 2>NUL
if errorlevel 1 echo %~1
:end
решение2
Я бы рекомендовал find, посмотрите man find. Что-то вроде find "%ProgramFiles%\" -iname ".exe" ! -regex "%ProgramFiles%\папка_для-исключения.$" -exec call :addcp {} \; может сделать то, что вам нужно.
решение3
%%F разрешается в путь к файлу .jar, а не в имя каталога, поэтому == не работает.
Я предлагаю двухэтапный процесс: сначала сделайте
dir /s /b directory\*.jar > temp.txt
а потом
for /F usebackq %%I in (`findstr /V <excluded path> temp.txt`) do call :addcp %%I
Параметр /V для findstr выводит все строки, которые не соответствуют переданной вами строке. Вы также можете использовать подстановочные знаки или даже регулярные выражения для исключения, если это действительно необходимо.