Войти

Показать полную графическую версию : [решено] Удаление подстроки в переменной For R


nexochyka
06-06-2017, 09:36
Доброго всем!
Проблема в следующем есть обработка по сжатию JPG файлов,
не обработанные файлы складируются в корневую директорию Int2Dir дополнительно могут создаваться произвольные поддиректории.
После сжатия файлы складируются в корневую директорию Rsz2Dir включая поддиректории созданные пользователем.
Проблема в извлечении имен поддиректорий для последующего их использования.
Кто подскажет где я туплю (без поддиректорий работает на ура).
ps: для сжатия используется nConvert от XnView (http://www.xnview.com/en/nconvert/)
эксплуатация на Windows x32,x64 (xp, 7, 10)


echo off

Set Int2Dir="c:\NConvert\тест 1"
Set Rsz2Dir="c:\NConvert\тест 2"

::Обходим файлы
For /R %Int2Dir% %%I In (*.jpg) Do (

::Извлекаем имена дополнительных директорий
set mystr="%%~dpI"
set mystr="%mystr:%Int2Dir%=%"

::Сжимаем файлы
nconvert -ratio -rtype lanczos -rflag decr -rflag orient -resize 1920 1200 -o "%Rsz2Dir%\%mystr%\__r_%%" "%%~I"

::Удаляем обработанные файлы
DEL /F /S /Q /A "%%~I"
)

alpap
06-06-2017, 14:38
Проблема в следующем (не важно - есть обработка по сжатию JPG файлов,) - поехали:

не обработанные файлы складируются в корневую директорию Int2Dir дополнительно могут создаваться произвольные поддиректории.
почему, как, зачем, кем?

После сжатия файлы складируются в корневую директорию Rsz2Dir включая поддиректории созданные пользователем.
так в корневую или поддиректории или и туда и туда

Соответственно - Проблема в извлечении имен поддиректорий, так что именно брать за основу точки поиска?

nexochyka
06-06-2017, 19:53
Вкратце Проблема в извлечении имен поддиректорий, точка отправления Int2Dir, файлы и в корне и в под директориях.

Детально Int2Dir неизменна, в ней пользователи создают произвольные директории с комбинацией цифр пробелов и русских символов (вариантов очень много, так что к ним привязываться нет смысла).
Далее обработанный файл включая созданную пользователем директорию (возможно и вложенную директорию, до 3х уровней вложения) нужно переместить в Rsz2Dir для дальнейших обработок.
Если файлы не классифицированы пользователь скинет их в корень Int2Dir без создания доп директорий.

alpap
07-06-2017, 09:27
Проблема в извлечении ИМЕН поддиректорий »
файлы и в корне и в под директориях »

это не совместимо логично

теоретически можно вытащить именно имена, но во-первых может быть и совпадение, а даже если и нет, какой смысл наблюдать использовать имя одного и того же списка папки уровнями двумя ниже.

вот так будут выведены полные пути всех папок и подпапок директории "Int2Dir":

@echo off
for /f "delims= eol=" %%a in ('2^>nul dir /ad/b/s "Int2Dir"') do echo %%a
pause


если убрать ключ /s - будут выводиться только имена папок, находящихся в анализируемой или текущей, если bat в ней, можно вместо имени директории поставить "%~1" и перетягивать нужную папку на bat, будете наблюдать на экране имена папок первого уровня этой директории

Да. Код сохранить в кодировке 866 (меньше проблем с русскими именами и путями)
И под
файлы и в корне и в под директориях »
я так понимаю подразумеваются папки или же надо вывести имена еще и файлов, тогда определитесь точнее что вообще требуется и как эти имена будут использоваться в дальнейшем.

nexochyka
07-06-2017, 12:23
Ну что ж...
Ваш пример ... крайне далек от поставленной задачи. И ваша фраза: (не важно - есть обработка по сжатию JPG файлов,) - »
говорит об отсутствии желания прочитать кусок рабочего кода и понять что именно нужно модернизировать.
С целью исключения детской переписки где каждый пытается показать себя грамотеем и предложить вариант из своей шкатулки я вставил кусок рабочего кода с фрагментом который необходимо модернизировать, о чем детально изложил.

echo off
Set Int2Dir="c:\NConvert\тест 1"
Set Rsz2Dir="c:\NConvert\тест 2"
::Обходим файлы
For /R %Int2Dir% %%I In (*.jpg) Do (
::Извлекаем имена дополнительных директорий
set mystr="%%~dpI"
set mystr="%mystr:%Int2Dir%=%"
::Сжимаем файлы
nconvert -ratio -rtype lanczos -rflag decr -rflag orient -resize 1920 1200 -o "%Rsz2Dir%\%mystr%\__r_%%" "%%~I"
) »

Если бы стояла задача в тупую перебрать директории я бы использовал аналогичный вашему вариант, задача стоит в перемещении файлов по директориям (с учетом произвольных) рекурсивно (For /R).

Но все равно спасибо за проявленный интерес.
Проблема не решена.

это не совместимо логично
теоретически можно вытащить именно имена, но во-первых может быть и совпадение, а даже если и нет, какой смысл наблюдать использовать имя одного и того же списка папки уровнями двумя ниже. »
Для понимания, это фото архив разных объектов и ситуаций сортируемый по дате создания снимка, объекту и ситуации.
В настоящий момент складирование осуществляется в единую папку (гггг/мм/дд) разделение осуществляется по имени файла (гмд_чмс_имяфайла_пользователь) на основании информации из exif, после чего недостающие директории создаются ручками.

megaloman
07-06-2017, 14:46
nexochyka, @Echo OFF
cls

Set "BoxIn=Z:\Box_In\CMD"
Set "BoxOut=Z:\Box_Out\Kuku"
Set "Mask=*.js"

FOR /F "usebackq delims=" %%f IN (`Dir "%BoxIn%\%Mask%" /S /B /A:-D 2^>nul`) DO Call :Work "%%f" "%%~dpf"
GoTo :Eof

:Work
Set "PathIn=%~2"
Call Set "PathOut=%%PathIn:%BoxIn%=%BoxOut%%%"
Echo %1
Echo %PathIn%
Echo %PathOut%
pause
GoTo :Eof
Подозреваю, что еще необходимо выходную папку создать, что-то наманер
If Not Exist "%PathOut%" Md "%PathOut%"

nexochyka
07-06-2017, 21:21
megaloman, благодарю, совсем забыл про необходимость выноса set из цикла for.

megaloman
08-06-2017, 11:49
nexochyka, совсем забыл про необходимость выноса set из цикла for. @Echo OFF
cls

Set "BoxIn=Z:\Box_In\CMD"
Set "BoxOut=Z:\Box_Out\Kuku"
Set "Mask=*.js"

SetLocal EnableExtensions EnableDelayedExpansion

FOR /R "%BoxIn%" %%f IN ("%Mask%") DO (
Set "FileIn=%%f"
Set "PathIn=%%~dpf"

Call Set "FileOut=%%FileIn:%BoxIn%=%BoxOut%%%"
Call Set "PathOut=%%PathIn:%BoxIn%=%BoxOut%%%"

Echo:
Echo !FileIn!
Echo !FileOut!

Echo:
Echo !PathIn!
Echo !PathOut!
Echo:

Pause
)
GoTo :Eof

nexochyka
08-06-2017, 12:06
Можно по подробнее про:
SetLocal EnableExtensions EnableDelayedExpansion

megaloman
08-06-2017, 12:22
nexochyka, Читаем хелп после выполнения команды SetLocal /?
Можно посмотреть тут. (http://www.cyberforum.ru/cmd-bat/thread940954.html)

Iska
08-06-2017, 18:46
Там токмо с формулировками напутано. Никакого «замораживания» нет. Переменные окружения по %…% раскрываются строго на момент перед исполнением команды, только и всего.




© OSzone.net 2001-2012