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

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

Kpblc 15-08-2019 11:19 2884129

Как получить имя файла по сортировке по второму символу из каталога
 
Доброго времени суток!

Есть рабочая версия команды, которая отдаёт правильный вывод:
Код:

DIR /b /o "%folder%\%FiLE_MASK%" | SORT /+2 /R
Нужно что бы работало в цикле FOR вот так:
Код:

for /f %%i in ('DIR /b /o "%folder%\%FiLE_MASK%" | SORT /+2 /R') do set filename=%%i
Но работает только так:
Код:

for /f %%i in ('DIR /b /o "%folder%\%FiLE_MASK%"') do set filename=%%i
Помогите составить правильный запрос в FOR для назначения переменной filename

Iska 15-08-2019 11:57 2884139

Kpblc, Вы чего-то не договариваете. Что Вы хотите получить в переменной окружения filename?

В настоящий момент, если экранировать перенаправление:
Цитата:

Цитата Kpblc
Код:

for /f %%i in ('DIR /b /o "%folder%\%FiLE_MASK%" ^| SORT /+2 /R') do set filename=%%i
»

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

Kpblc 15-08-2019 13:19 2884162

Помогло! Спасибо!

Цитата:

Цитата Iska
Вы чего-то не договариваете »

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

Всплыла ещё одна )))

Данные находятся на сетевом ресурсе прикрученные как сетевой диск, в примере выше мы обращаемся к папке на сетевом диске "X:\folder" и ищем в папке файлы отвечающие требованию. Но было бы здорово искать по всему диску X:\

После смены уровня папок и добавления в DIR ключа /S, поиск прекращается, файлы не найдены.
Код:

for /f %%i in ('DIR /b /o /S "%folder%\%FiLE_MASK%" ^| SORT /+2 /R') do set filename=%%i
И снова прошу о помощи.

Iska 15-08-2019 14:49 2884186

Цитата:

Цитата Kpblc
в примере выше мы обращаемся к папке на сетевом диске "X:\folder" »

Я этого не вижу по коду. Я вижу некую переменную окружения folder с неизвестным значением.

Цитата:

Цитата Kpblc
После смены уровня папок »

Как Вы это делаете? Опять же, кода нет, гадать желания тоже нет.

Цитата:

Цитата Kpblc
и добавления в DIR ключа /S, поиск прекращается, файлы не найдены. »

Поиск не прекращается, файлы найдены. Но при использовании параметра /s совместно с параметром /b — возвращаются уже не имена файлов, а полные пути. Соответственно, нет никакого смысла пытаться их сортировать командой sort.exe.

Попробуйте описать Вашу задачу, а не уже выбранный способ её решения.

Kpblc 15-08-2019 16:19 2884212

Цитата:

Цитата Iska
Попробуйте описать Вашу задачу, а не уже выбранный способ её решения. »

ok

1. В X:\Folder\today создаются документы с помощью bat скрипта
2. Создаваемый файл имеет строгую маску ID.(1-9).(1+...).txt (результат работы "id1.1.1" "id1.1.2" "id1.2.1" ...)
3. При создании нового файла через скрипт, сначала идёт запрос ID (цифры, вводится в ручную), далее идёт поиск в папке по существующим файлам с этим ID и если он их находит, сортирует по второму значению (1-9), к найденному максимальному значению добавляет +1, и с новым значением отправляет на меню для выбора следующего значения.
4. Каждую ночь, файлы переносятся в папку с датой X:\FolderDATE\yestardayDATE. Это необходимая процедура для дальнейшей работы с созданными файлами.

Сейчас скрипт ищет в папке X:\Folder1\today и благополучно стал находить и присваивать правильный порядковый номер (1-9) в не зависимости от даты создания файла. Но было бы удобно искать глобально на диске X:\ по ID в пределах 15 дней, что бы присваивать порядковый номер (1-9) и исключить возможные дубликаты в соседних папках X:\FolderDATE\yestardayDATE

alpap 15-08-2019 22:53 2884280

Цитата:

Цитата Kpblc
4. Каждую ночь, файлы переносятся в папку »

Цитата:

Цитата Kpblc
было бы удобно искать ... в пределах 15 дней »

а откуда тогда файлы с датой более суток (и до 15)
Задача описана не полностью. Зачем создаются файлы, с какой интенсивностью и в каком количестве?
Цитата:

Цитата Kpblc
3. При создании нового файла через скрипт, сначала идёт запрос ID (цифры, вводится в ручную) »

Почему так, мне лично непонятно.
Цитата:

Цитата Kpblc
3. При создании нового файла через скрипт, сначала идёт запрос ID (цифры, вводится в ручную), далее идёт поиск в папке по существующим файлам с этим ID и если он их находит, сортирует по второму значению (1-9), к найденному максимальному значению добавляет +1, и с новым значением отправляет на меню для выбора следующего значения. »

Какое-то скучное занятие. А какая основная, глобальная цель этого всего. Что нужно осуществлять вообще, может по другому можно это все реализовать?

Iska 16-08-2019 04:06 2884299

Цитата:

Цитата Kpblc
2. Создаваемый файл имеет строгую маску ID.(1-9).(1+...).txt (результат работы "id1.1.1" "id1.1.2" "id1.2.1" ...) »

Так «ID.(1-9).(1+...).txt» или же «"id1.1.1" "id1.1.2" "id1.2.1"» — есть там точка сразу после ID или нет?!

Цитата:

Цитата Kpblc
сортирует по второму значению (1-9), »

Видимо — «по первому».

Опять-таки, присоединюсь к коллеге alpap — Вы по-прежнему пытаетесь описать некую реализацию уже выбранного решения, а не саму задачу.

Kpblc 16-08-2019 10:11 2884311

Постараюсь ответить всем сразу.



Цитата:

Цитата alpap
а откуда тогда файлы с датой более суток (и до 15)
Задача описана не полностью. Зачем создаются файлы, с какой интенсивностью и в каком количестве? »

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

Цитата:

Цитата alpap
Почему так, мне лично непонятно. »

Если это так важно? Этот ID является частью БД, данные которой дополняются в таком формате, возможности интегрироваться в БД на другом уровне - нет, и это будет лишним.

Уважаемые, мы отходим от сути... "Скучное занятие...", "Мне не понятно зачем..." Это отвлекает.

Я прошу о помощи в реализации дополнения уже построенной логики работы.

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

Код:

set folder=X:\Folder\today
set file_mask=???.?.?.txt

for /f %%i in ('DIR /b /o "%folder%\%FiLE_MASK%" ^| SORT /+4 /R') do set filename=%%i
echo %filename%

при подстановке и добавлении ключа /S
Код:

set folder=X:
set file_mask=???.?.?.txt

for /f %%i in ('DIR /b /o /S "%folder%\%FiLE_MASK%" ^| SORT /+4 /R') do set filename=%%i
echo %filename%

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

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

megaloman 16-08-2019 10:58 2884320

Kpblc, я не понимаю задачу, но очевидный облом:
Без ключа /s dir выдаёт имена файлов, и Вы их сортируете с четвертого символа
С ключом /s dir выдаёт пути\имена файлов и что там в четвертом символе- явно не то, что Вам бы хотелось.

megaloman 16-08-2019 12:28 2884329

Kpblc, Я не гуру, я не понимаю задачу, даром телепатии обделён, обсуждение темы коллегами погурее меня не приблизило меня к пониманию: что-то вводится вручную, куда-то что-то добавляется (при этом значения остаются не более 9 -убейте, не могу придумать, как это получается), откуда-то всплывают дни ...
Однако если тупо в папке и подпапках в файлах с именами IDi.j.k.txt (i,j,k=1,2...9) надо найти файл с максимальным jk, то вот такой вариант:
Код:

@Echo Off
        Set "BoxIn=Z:\Box_In"
        Set "Mask=id?.?.?.txt"

        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /S`) DO (
                FOR /F "tokens=1,2,3 delims=." %%i IN ("%%~nf") DO Set "@@%%j%%k=%%f"
        )
        FOR /F "usebackq tokens=1,2 delims==" %%i IN (`Set "@@"`) DO Set "FullName=%%j" &Set "Name=%%~nj"
Echo %Name%  %FullName%  %Name:~4,1%  %Name:~6,1%
Exit /B

Естественно, если файлов с максимальным jk несколько, отобразится последний из найденных.


Время: 23:50.

Время: 23:50.
© OSzone.net 2001-