Необходимо исключить определенный результат из цикла Batch For

Необходимо исключить определенный результат из цикла Batch For

У меня есть скрипт, который рекурсивно загружает файлы из определенного каталога (и подкаталогов) в 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 выводит все строки, которые не соответствуют переданной вами строке. Вы также можете использовать подстановочные знаки или даже регулярные выражения для исключения, если это действительно необходимо.

Связанный контент