Показать полную графическую версию : [решено] Удаление подстроки в переменной 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"
)
Проблема в следующем (не важно - есть обработка по сжатию JPG файлов,) - поехали:
не обработанные файлы складируются в корневую директорию Int2Dir дополнительно могут создаваться произвольные поддиректории.
почему, как, зачем, кем?
После сжатия файлы складируются в корневую директорию Rsz2Dir включая поддиректории созданные пользователем.
так в корневую или поддиректории или и туда и туда
Соответственно - Проблема в извлечении имен поддиректорий, так что именно брать за основу точки поиска?
nexochyka
06-06-2017, 19:53
Вкратце Проблема в извлечении имен поддиректорий, точка отправления Int2Dir, файлы и в корне и в под директориях.
Детально Int2Dir неизменна, в ней пользователи создают произвольные директории с комбинацией цифр пробелов и русских символов (вариантов очень много, так что к ним привязываться нет смысла).
Далее обработанный файл включая созданную пользователем директорию (возможно и вложенную директорию, до 3х уровней вложения) нужно переместить в Rsz2Dir для дальнейших обработок.
Если файлы не классифицированы пользователь скинет их в корень Int2Dir без создания доп директорий.
Проблема в извлечении ИМЕН поддиректорий »
файлы и в корне и в под директориях »
это не совместимо логично
теоретически можно вытащить именно имена, но во-первых может быть и совпадение, а даже если и нет, какой смысл наблюдать использовать имя одного и того же списка папки уровнями двумя ниже.
вот так будут выведены полные пути всех папок и подпапок директории "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)
Там токмо с формулировками напутано. Никакого «замораживания» нет. Переменные окружения по %…% раскрываются строго на момент перед исполнением команды, только и всего.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.