Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Как получить имя файла по сортировке по второму символу из каталога

Ответить
Настройки темы
CMD/BAT - Как получить имя файла по сортировке по второму символу из каталога

Аватара для Kpblc

Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброго времени суток!

Есть рабочая версия команды, которая отдаёт правильный вывод:
Код: Выделить весь код
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

Отправлено: 11:19, 15-08-2019

 

Ветеран


Contributor


Сообщения: 24590
Благодарности: 7153

Профиль | Отправить PM | Цитировать


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

В настоящий момент, если экранировать перенаправление:
Цитата Kpblc:
Код: Выделить весь код
for /f %%i in ('DIR /b /o "%folder%\%FiLE_MASK%" ^| SORT /+2 /R') do set filename=%%i
»
и имена файлов не содержат пробельных символов — Вы получаете имя очередного файла в цикле разбора и имя последнего файла после цикла разбора.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:57, 15-08-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для Kpblc

Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

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

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

После смены уровня папок и добавления в DIR ключа /S, поиск прекращается, файлы не найдены.
Код: Выделить весь код
for /f %%i in ('DIR /b /o /S "%folder%\%FiLE_MASK%" ^| SORT /+2 /R') do set filename=%%i
И снова прошу о помощи.

Отправлено: 13:19, 15-08-2019 | #3


Ветеран


Contributor


Сообщения: 24590
Благодарности: 7153

Профиль | Отправить PM | Цитировать


Цитата Kpblc:
в примере выше мы обращаемся к папке на сетевом диске "X:\folder" »
Я этого не вижу по коду. Я вижу некую переменную окружения folder с неизвестным значением.

Цитата Kpblc:
После смены уровня папок »
Как Вы это делаете? Опять же, кода нет, гадать желания тоже нет.

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

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

Отправлено: 14:49, 15-08-2019 | #4


Аватара для Kpblc

Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось Kpblc, 15-08-2019 в 16:21. Причина: задублилось сообщение


Отправлено: 16:19, 15-08-2019 | #5


Ветеран


Сообщения: 881
Благодарности: 330

Профиль | Отправить PM | Цитировать


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

Отправлено: 22:53, 15-08-2019 | #6


Ветеран


Contributor


Сообщения: 24590
Благодарности: 7153

Профиль | Отправить PM | Цитировать


Цитата 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 — Вы по-прежнему пытаетесь описать некую реализацию уже выбранного решения, а не саму задачу.
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:06, 16-08-2019 | #7


Аватара для Kpblc

Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


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



Цитата 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, без права публикации). Я прошу помощи в формулировании строки поиска из корня диска с возможностью продолжения работы в том же, построенном, режиме и с той же логикой, которая необходима мне.

Отправлено: 10:11, 16-08-2019 | #8


Ветеран


Contributor


Сообщения: 1700
Благодарности: 1010

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 10:58, 16-08-2019 | #9


Ветеран


Contributor


Сообщения: 1700
Благодарности: 1010

Профиль | Отправить PM | Цитировать


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 несколько, отобразится последний из найденных.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 16-08-2019 в 12:48.


Отправлено: 12:28, 16-08-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Как получить имя файла по сортировке по второму символу из каталога

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Копирование названия файлов из списка по символу в отдельный файл f1rstonlyone@vk Скриптовые языки администрирования Windows 2 07-06-2017 22:08
PowerShell - [решено] Инвентаризация компьютеров (По данным из AD, из файла, или просто указав имя компа) dark-------13 Скриптовые языки администрирования Windows 1 28-04-2015 15:34
CMD/BAT - Как из бат-файла проверить наличие файла по ссылке, не скачивая файл ? mitiya Скриптовые языки администрирования Windows 2 27-06-2008 20:50
Как получить имя владельца файла на WINAPI vasika_hk Программирование и базы данных 1 31-05-2006 23:03
Как получить имя текущего пользователя для использования его в имени файла Denchik Автоматическая установка Windows 2000/XP/2003 1 25-01-2006 22:33




 
Переход