Назад | Перейти на главную страницу

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

У меня есть сценарий, который рекурсивно загружает файлы из определенного каталога (и подкаталогов) в путь к классам Java, используя цикл FOR. Выглядит это так:

FOR / r каталог %% F IN (* .jar) НЕОБХОДИМО вызвать: addcp %% F

К сожалению, теперь мне нужно исключить конкретный подкаталог из результатов (я не хочу, чтобы загружались некоторые файлы jar). Я попытался вложить оператор IF в цикл FOR, но безуспешно.

К сожалению, изменение языков сценариев невозможно, и повторение каждого подкаталога стало бы кошмаром для обслуживания. У кого-нибудь есть способ это сделать?

Я пробовал что-то вроде:

FOR / r каталог %% F IN (*.jar) DO IF %% F ==*строка* ВЫЗЫВАТЬ: addcp %% F

но это не сработало.

Вот сценарий для создания дампа списка абсолютных путей всех файлов 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

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

Я бы порекомендовал найти, взгляните на мужскую находку. Что-то вроде find "% ProgramFiles% \" -iname ".exe "! -regex"% ProgramFiles% \ folder_to-exclude.$ "-exec call: addcp {} \; может делать то, что вы хотите.