Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Удаление подстроки в переменной For R (http://forum.oszone.net/showthread.php?t=327369)

nexochyka 06-06-2017 09:36 2742378

Удаление подстроки в переменной For R
 
Доброго всем!
Проблема в следующем есть обработка по сжатию 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 2742445

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

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

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

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

nexochyka 06-06-2017 19:53 2742522

Вкратце Проблема в извлечении имен поддиректорий, точка отправления Int2Dir, файлы и в корне и в под директориях.

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

alpap 07-06-2017 09:27 2742606

Цитата:

Цитата nexochyka
Проблема в извлечении ИМЕН поддиректорий »

Цитата:

Цитата nexochyka
файлы и в корне и в под директориях »

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

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

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

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

nexochyka 07-06-2017 12:23 2742659

Ну что ж...
Ваш пример ... крайне далек от поставленной задачи. И ваша фраза:
Цитата:

Цитата alpap
(не важно - есть обработка по сжатию JPG файлов,) - »

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

Цитата:

Цитата nexochyka
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).

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


Цитата:

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

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

megaloman 07-06-2017 14:46 2742699

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 2742811

megaloman, благодарю, совсем забыл про необходимость выноса set из цикла for.

megaloman 08-06-2017 11:49 2742896

nexochyka,
Цитата:

Цитата 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 2742898

Можно по подробнее про:
SetLocal EnableExtensions EnableDelayedExpansion

megaloman 08-06-2017 12:22 2742902

nexochyka, Читаем хелп после выполнения команды SetLocal /?
Можно посмотреть тут.

Iska 08-06-2017 18:46 2743006

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


Время: 11:42.

Время: 11:42.
© OSzone.net 2001-