Компьютерный форум 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=332439)

it3 11-01-2018 11:25 2790479

Перемещение и переименование файлов
 
Доброго дня всем!
Подсобите пожалуйста BAT'ником.
Есть папка с файлами "NaklScan":
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
"2018-01-18_(5).tif",
"2018-01-18_(6).tif",
... ... ... ... ... ... ...
"2018-01-18_(7000).tif",
... ... ... ... ... ... ...
которая после 3000 файлов начинает долго открываться (т.к. строится список).
Нужно чтобы из этой папки (NaklScan) файлы перемещались в другую папку (NaklScan5) - предположим по 100 шт.

Но загвоздка в том, что после перемещения файлов:
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
"2018-01-18_(5).tif",
"2018-01-18_(6).tif",
... ... ... ... ... ... ...
"2018-01-18_(7000).tif",
... ... ... ... ... ... ...
в папку "NaklScan5", в папке "NaklScan" будут снова создаваться файлы с такими же именами.

Т.е. нужно чтобы при перемещении в папку "NaklScan5" порядковый номер продолжался:

"2018-01-18_(7001).tif",
"2018-01-18_(7002).tif",
"2018-01-18_(7003).tif",
"2018-01-18_(7004).tif",
"2018-01-18_(7005).tif",
"2018-01-18_(7006).tif".

alpap 11-01-2018 13:48 2790524

Цитата:

Цитата it3
которая после 3000 файлов начинает долго открываться »

тогда почему сразу не предусмотреть заполнение таким образом, вошли в папку if кол-во==1000 вышли и т.д. и лучше это сразу делать (надо целиком знать задачу, что когда и как формирует файлы), а не перемещать потом, а сейчас ..., bat долго будет переваривать такие количества, тут лучше PS подключить.

it3 11-01-2018 14:20 2790532

Цитата:

Цитата alpap
тогда почему сразу не предусмотреть заполнение таким образом, вошли в папку if кол-во==1000 вышли и т.д. и лучше это сразу делать (надо целиком знать задачу, что когда и как формирует файлы), а не перемещать потом, а сейчас ..., bat долго будет переваривать такие количества, тут лучше PS подключить. »

Файлы сканируются в один каталог, после чего они распознаются и переносятся в другой каталог для дальнейшей обработки. Нельзя раскидать по каталогам - по 1000 файлов!

Elven 11-01-2018 14:42 2790539

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

как происходит распознавание? учитывая приведенные числа - тоже скриптом, или софт какой-то хитрый который на это нацелен?
Если скрипт - дописать Перенос в другой каталог после распознавания. Если софтом - нужно разбираться к чему привязываться (например как определить что файл уже распознан и готов к переносу?)
чтобы нумерация была сквозная можно либо искать максимальное по номеру имя в "NaklScan5" и прибавлять к нему 1 (или 2,3,5,7000 - как задумано, в общем), либо еще проще - записывать номер последнего перенесенного файла в, например, текстовик, и при переносе очередного файла - читать и прибавлять опять же столько сколько нужно.
Где я не прав? В каком месте нужна помощь?

it3 11-01-2018 15:04 2790550

Вопрос касается сканирования (не распознавания).
Распознавания не берем в счёт.
Т.е. есть программа PaperPort, которая сканирует в один каталог по 3000-7000 изображений в формате *.tiff. Имя: гггг-мм-дд_(#)
Когда порог сканирования достигает отметки в 2000, то следующие сканируемые файлы *.tiff начинаются отображаться в программе медленнее (может программа такая, может компьютер слаб - не столь важно) -> влияет на это именно количество файлов в каталоге.

Вот и пришла идея, а что если состряпать BAT-ник, который будет таскать *.tif файлы в другой каталог (в который пользователь не заходит - соответственно список не формируется - соответственно компьютер не тормозит и т.п. и т.д.), но таким образом, чтобы все файлы имели порядковый номер: гггг-мм-дд_(порядковый_номер).

Вариант:
1. BAT-ник таскает файлы все в одну папку - но не перезаписывает их, а переименовывает, например:
гггг-мм-дд_(порядковый_номер)1;
гггг-мм-дд_(порядковый_номер)2;
гггг-мм-дд_(порядковый_номер)3
...
2. Оставляя:

гггг-мм-дд_

переименовывает порядковый номер в скобках.
Итог:
гггг-мм-дд_(1);
гггг-мм-дд_(2);
гггг-мм-дд_(3);
гггг-мм-дд_(4);
гггг-мм-дд_(5);
гггг-мм-дд_(6);
...
...
...

Elven 11-01-2018 15:34 2790563

т.е. нужно просто брать файлы начиная с самого старого в одном каталоге и переместить фиксированное количество файлов (например 1000) в другой каталог. с нумерацией не совсем понятно: например в папке последний файл который был перенесен носит имя "гггг-мм-дд_(1000).tiff" следующие файлы должны продолжить нумерацию ("гггг-мм-дд_(1001).tiff","гггг-мм-дд_(1002).tiff" и т.д.) или как-то по другому?

it3 11-01-2018 15:45 2790567

Цитата:

Цитата Elven
т.е. нужно просто брать файлы начиная с самого старого в одном каталоге и переместить фиксированное количество файлов (например 1000) в другой каталог. с нумерацией не совсем понятно: например в папке последний файл который был перенесен носит имя "гггг-мм-дд_(1000).tiff" следующие файлы должны продолжить нумерацию ("гггг-мм-дд_(1001).tiff","гггг-мм-дд_(1002).tiff" и т.д.) или как-то по другому? »

Всё верно!

Elven 11-01-2018 17:47 2790592

Примерно так. numb.txt - файл с номером последнего перенесенного файла
Код:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set ocat=C:\старая\папка\
set ncat=Н:\овая\папка\
for /f %%j in (numb.txt) do set numb=%%j
set /a N=0
for /F "delims=" %%i in ('dir /a:-d /o:d /t:c /b') do (
set /a N=!N!+1
if !N! leq 1000 (
set /a numb=!numb!+1
set oname=%%i
set nname=!oname:~0,12!!numb!!oname:~-6!
REM move /Y !ocat!!oname! !ncat!!nname!
echo !numb!>numb.txt
)
)


alpap 11-01-2018 19:16 2790612

it3,
я вот одного не пойму - зачем переименовывать файлы, продолжать нумерацию, вы же их просто перемещаете, раскидывайте по одной тысяче, например, как есть да и все:
(имею ввиду что для "01-18" конец в нумерации надеюсь бывает и вряд-ли это 1000 000, поэтому в конце дня батничек на запуск - к утру раскидает, а утром уже "01-19" и поехали заново)
Код:

@echo off
set "d=NaklScan"
:: Число файлов для разбивки по папкам
set kf=1000

:l
set /a m+=1
setlocal enabledelayedexpansion
 2>nul dir/a-d/b "%d%"|>nul find /v "" || goto :eof
 for /f "delims=" %%a in ('2^>nul dir /a-d/b "%d%"') do (
  if not exist "%d%%m%" md "%d%%m%"
  set /a n+=1& if !n! leq %kf% >nul move/y "%d%\%%a" "%d%%m%\%%a"
 )
endlocal
goto l
pause


it3 12-01-2018 06:36 2790699

Цитата:

Цитата megaloman
То есть в том другом каталоге получим громадное число файлов? »

Да.
Цитата:

Цитата megaloman
А, кстати, какой максимальный номер может быть достигнут? »

Всегда по разному.
Цитата:

Цитата megaloman
Почему папка называется "NaklScan5" а не "NaklScan125", например: - номер в имени папки несет смысловую нагрузку? »

Нет смысла.
Цитата:

Цитата megaloman
А если в исходном каталоге, например, 3333 файла, то там после перемещения 1000 файлов останется 2333 до следующего запуска батника? »

Нет. К 2333 будет постоянно прибавляться еще файлы.

Цитата:

Цитата alpap
поэтому в конце дня батничек на запуск - к утру раскидает, а утром уже "01-19" и поехали заново »

Нужно чтобы это выполнялось не утром, не в конце дня, а на протяжении дня - т.е. пока документы сканируются.
Я ведь написал.
Цитата:

Цитата it3
Когда порог сканирования достигает отметки в 2000, то следующие сканируемые файлы *.tiff начинаются отображаться в программе медленнее (может программа такая, может компьютер слаб - не столь важно) -> влияет на это именно количество файлов в каталоге. »


it3 12-01-2018 07:07 2790703

Или же, сделать так:
1. Перемещение файлов без перезаписи (если имя уже такое существует), но не теряя новый файл (например в его имя добавить какой нибудь символ).
и
2. Переименовать всё содержимое в папке в:

"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
"2018-01-18_(5).tif",
"2018-01-18_(6).tif",
... ... ... ... ... ... ...
"2018-01-18_(7000).tif",
... ... ... ... ... ... ...

megaloman 12-01-2018 07:28 2790708

it3, цель батника- уменьшить число файлов в папке NaklScan. Откуда берётся исходная нумерация? Каждый день она начинается с 1? Программа сканирования сама определяет исходный номер и продолжает нумерацию сегодняшнего дня? Тогда зачем что-то переименовывать? Пусть батник оставляет в папке NaklScan, например, 1000 последних файлов (или вообще 1 последний, чтобы программа сканирования продолжила нумерацию), а всё остальное перемещает в NaklScan5, причем не в общую кучу, а по подпапкам, для каждого дня своя. Например: NaklScan5\гггг-мм-дд\

it3 12-01-2018 07:35 2790710

Цитата:

Цитата megaloman
it3, цель батника- уменьшить число файлов в папке NaklScan. Откуда берётся исходная нумерация? Каждый день она начинается с 1? »

Каждый день она начинается с 1.

Цитата:

Цитата megaloman
Пусть батник оставляет в папке NaklScan, например, 1000 последних файлов, а всё остальное перемещает в NaklScan5, причем не в общую кучу, а по подпапкам, для каждого дня своя. Например: NaklScan5\гггг-мм-дд\ »

Задача: Все файлы должны находиться в одном каталоге, без подкаталогов.

it3 12-01-2018 07:45 2790714

Цитата:

Цитата megaloman
Оставляем 1 файл в папке NaklScan, чтобы программа сканирования могла продолжить нумерацию, а всеостальные перемещаем в NaklScan5. Никакого дублирования имён. »

Переместили:

"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
"2018-01-18_(5).tif",

Оставили:

"2018-01-18_(1).tif"

Сканируем, создаются новые имена:

"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
"2018-01-18_(5).tif",

При перемещении - они не должны заменяться.

megaloman 12-01-2018 07:50 2790716

it3, Переместили:

"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",

Оставили:

"2018-01-18_(5).tif"

Сканируем, создаются новые имена:

"2018-01-18_(6).tif",
"2018-01-18_(7).tif",
"2018-01-18_(8).tif",
"2018-01-18_(9).tif",

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

it3 12-01-2018 08:05 2790719

Цитата:

Цитата megaloman
it3, Переместили:
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
Оставили:
"2018-01-18_(5).tif"
Сканируем, создаются новые имена:
"2018-01-18_(6).tif",
"2018-01-18_(7).tif",
"2018-01-18_(8).tif",
"2018-01-18_(9).tif",
При перемещении - они не будут заменяться, если программа сканирования продолжит нумерацию.
И вообще, в любом случае надо не перемещать в другую папку по 1000 файлов, а оставлять в исходной минимальное количество, например 1. »

Прошу прощения.
Протестировал.

Если мы переместили:

"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",

Оставили:

"2018-01-18_(5).tif"

Сканируем, создаются новые имена:

"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif".

megaloman 12-01-2018 10:06 2790737

Цитата:

Цитата it3
Оставили:
"2018-01-18_(5).tif"
Сканируем, создаются новые имена:
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif". »

Ну, раз пошла такая вакханалия, то вот решение:
Забираем всё из папки NaklScan в папку NaklScan5, в папке NaklScan5 нумерация сплошная для каждого дня, от более старого к более новому, не вижу смысла что-то оставлять в NaklScan и переписывать оттуда файлы порциями
Код:

@Echo Off
cls

Set "BoxIn=Z:\Box_In\NaklScan"
Set "BoxOut=Z:\Box_In\NaklScan5"
Set "Mask=20??-??-??_(*).tif"

If Not Exist "%BoxOut%" Md "%BoxOut%"

SetLocal EnableExtensions EnableDelayedExpansion

Set "TDate="
FOR /F "usebackq tokens=1,2* delims=()" %%i IN (`2^>nul Dir "%BoxIn%\%Mask%" /A:-D /B /O:D /T:C`) DO (
        If Not "!TDate!"=="%%i" (
                Set "TDate=%%i"
                Call :LastNum "%%i" "%%k" "N"
        )
        Set /A N+=1
        >nul Move "%BoxIn%\%%i(%%j)%%k" "%BoxOut%\%%i(!N!)%%k"
)
GoTo :Eof

:LastNum
        Set /A %~3=0
        FOR /F "usebackq tokens=2 delims=()" %%n IN (`2^>nul Dir "%BoxOut%\%~1(*)%~2" /A:-D /B /O:-D /T:C`) DO Set /A %~3=%%n &GoTo :Eof
GoTo :Eof

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

Iska 12-01-2018 11:08 2790755

Цитата:

Цитата it3
Оставили:
"2018-01-18_(5).tif"
Сканируем, создаются новые имена:
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif". »

Я всё ждал, когда сей факт внезапно :) всплывёт в процессе реализации хотелки порциями.

it3 12-01-2018 11:09 2790759

megaloman, огромное спасибо. BAT-ник работает как надо.
Вопрос закрыт.

DJ Mogarych 12-01-2018 14:02 2790805

Если в сканере можно настроить именование файлов не только днём, но и прибавлять к нему время, типа 2018-01-18_12-15-23.tif - проблемы бы вообще не существовало. Можно было бы переносить в какие угодно подпапки, хоть по часам.

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

megaloman 12-01-2018 16:23 2790829

DJ Mogarych, it3,
Цитата:

Цитата DJ Mogarych
тогда можно файлы переименовывать по дате создания перед копированием »

Файлы изначально именуются с датой создания как гггг-мм-дд_(хххх).tif, тут уже не за чем напрягаться. Что касается времени создания, Я рассматривал этот вариант, но, увы, в CMD выдернуть время создания файла хотя бы с секундами я не умею, а делать какой-нибудь костыль - при большом количестве файлов это резко замедлит работу.
Вот вариант со временем.
Код:

@Echo Off
cls

Set "BoxIn=Z:\Box_In\NaklScan"
Set "BoxOut=Z:\Box_In\NaklScan5"
Set "Mask=20??-??-??_(*).tif"

If Not Exist "%BoxOut%" Md "%BoxOut%"

FOR /F "usebackq tokens=1,2* delims=()" %%i IN (`2^>nul Dir "%BoxIn%\%Mask%" /A:-D /B /O:D /T:C`) DO Call :Transfer "%%i" "%%k" "%BoxIn%\%%i(%%j)%%k"

Pause
GoTo :Eof

:Transfer
        Set "Ftime=%~t3"
        Set "Ftime=%Ftime:~-5%"
        Set "Ftime=%Ftime::=%"
        Set "Ftime=%Ftime: =0%"
        Set /A ND=1
        Set "NewFile=%BoxOut%\%~1%Ftime%%~2"
        :Begin
                If Not Exist "%NewFile%" (
                        Move %3 "%NewFile%" >nul
                        GoTo :Eof
                )
                Set /A ND+=1
                Set "NewFile=%BoxOut%\%~1%Ftime%-%ND%%~2"
        GoTo :Begin
GoTo :Eof

Формат имен перемещенных файлов при этом
гггг-мм-дд_ччми.tif
Если за одну минуту создадутся несколько файлов, то имена будут иметь вид:
гггг-мм-дд_ччми.tif
гггг-мм-дд_ччми-2.tif
гггг-мм-дд_ччми-3.tif и т д.

it3 09-06-2018 07:47 2817548

Доброго времени суток всем!
Есть необходимость перемещать файлы:

"2018-01-18.tif",
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
"2018-01-18_(5).tif",
"2018-01-18_(6).tif",
"2018-01-18_(7).tif",
"2018-01-18_(8).tif",
"2018-01-18_(9).tif",
"2018-01-18_(10).tif",
"2018-01-18_(11).tif",
"2018-01-18_(12).tif",
"2018-01-18_(13).tif",
"2018-01-18_(14).tif",
... ... ... ... ... ... ... ... ...
"2018-01-18_(7000).tif",
"2018-01-18_(7001).tif",
"2018-01-18_(7002).tif",
"2018-01-18_(7003).tif",
"2018-01-18_(7004).tif",
... ... ... ... ... ... ... ... ...

Но таким образом, чтобы переместились все файлы, кроме последнего. Т.е. эти переместились:

"2018-01-18.tif",
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
"2018-01-18_(5).tif",
"2018-01-18_(6).tif",
"2018-01-18_(7).tif",
"2018-01-18_(8).tif",
"2018-01-18_(9).tif",
"2018-01-18_(10).tif",
"2018-01-18_(11).tif",
"2018-01-18_(12).tif",
"2018-01-18_(13).tif",
"2018-01-18_(14).tif",
... ... ... ... ... ... ... ... ...
"2018-01-18_(7000).tif",
"2018-01-18_(7001).tif",
"2018-01-18_(7002).tif",
"2018-01-18_(7003).tif",

А этот остался:

"2018-01-18_(7004).tif".

Подскажите пожалуйста, как реализовать?

mwz 09-06-2018 10:16 2817571

it3, плохо что у вас имена файлов не структурированы, и при простом анализе файл, например, "2018-01-18_(6).tif", будет идти после файлов с "2018-01-18_(5000).tif" по "2018-01-18_(5999).tif".

it3 09-06-2018 10:41 2817578

Цитата:

Цитата mwz
it3, плохо что у вас имена файлов не структурированы, и при простом анализе файл, например, "2018-01-18_(6).tif", будет идти после файлов с "2018-01-18_(5000).tif" по "2018-01-18_(5999).tif". »

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

mwz 09-06-2018 10:54 2817580

Цитата:

Цитата it3
Можно ведь переносить по времени создания »

Можно и так — и будет быстрее; поскольку хоть и можно организовать перевод величин в скобках из текстового в числовое представление — дальнейший анализ всё равно будет сложнее.

А здесь можно организовать цикл:
Проверяем два последовательных файла (причём что это за файлы — всё равно). Если второго файла нет — завершаем работу: задача выполнена.
Если есть — сравниваем даты, более старый перемещаем и идём в начало цикла.

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

megaloman 09-06-2018 11:19 2817588

it3,
Цитата:

Цитата it3
Можно ведь переносить по времени создания. »

Проще пареной репы
Код:

@Echo Off

Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_Out"
Set "Mask=2018-01-18*.tif"

FOR /F "usebackq skip=1 delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:-D /T:C`) DO >nul Move "%BoxIn%\%%f" "%BoxOut%\"

GoTo :Eof

Но подозреваю, начнётся уточнение и развитие постановки, и код надо будет пересаживать и выращивать.

YuS_2 09-06-2018 11:35 2817590

Цитата:

Цитата it3
Подскажите пожалуйста, как реализовать? »

Вопрос в том, как происходит отбор файлов. В смысле в каталоге присутствуют ещё *.tif, кроме перечисленных?
А так, с помощью powershell и ... ну да ладно, пока без лирики:
script.ps1
Код:

$src = 'c:\source'
$dst = 'c:\destination'
dir "$src\*" -inc "*.tif" -file|sort -prop @{
        Expression={[int]($_.name -split "\(|\)")[1]}
} -desc|select -skip 1|%{mi $_.fullname $dst}


it3 09-06-2018 11:52 2817593

Вложений: 2
Исправил маску:
Код:

@Echo Off

Set "BoxIn=c:\Temp\Archive\"
Set "BoxOut=c:\Temp\Archive\1\"
Set "Mask=20??-??-??_(*).tif"

FOR /F "usebackq skip=1 delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:-D /T:C`) DO >nul Move "%BoxIn%\%%f" "%BoxOut%\"

GoTo :Eof

Но этот скрипт оставляет в папке "c:\Temp\Archive\" один файл, который был создан раньше всех, а должно быть наоборот. Должен оставаться файл, который был создан позже всех.
Скриншоты во вложении.

it3 09-06-2018 11:55 2817595

Цитата:

Цитата YuS_2
Вопрос в том, как происходит отбор файлов. В смысле в каталоге присутствуют ещё *.tif, кроме перечисленных?
»

Нет.
Скрипт работает. Спасибо.

megaloman 09-06-2018 12:34 2817603

it3, Подозреваю, Вы используете тестовую папку, в которую накопировали файлы. И в каком порядке они копировались (создавались при этом) - Вам лучше знать. Как и то, какое время на скриншотах отображено. Попробуйте скрипт с ключом не /T:C (по времени создания) а /T:W (по времени изменения).
Цитата:

Цитата it3
Set "Mask=20??-??-??_(*).tif" »

При наличии в папке данных за много дней останется единственный самый последний файл за самый последний день.
Кроме того, останутся все файлы 20??-??-??.tif. Вас это устраивает?

it3 09-06-2018 13:58 2817618

Цитата:

Цитата megaloman
Кроме того, останутся все файлы 20??-??-??.tif. Вас это устраивает? »

Нет.

megaloman 09-06-2018 18:32 2817653

it3, Что Вас не устраивает? Останутся все файлы 20??-??-??.tif? Или что останется единственный нумерованный файл?
it3, Если надо в каждой дате сохранить последний файл (отбор файла по каждой дате по времени последнего изменения)
Код:

@Echo Off
Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_Out"
Set "Mask=20??-??-??*.tif"

Set "Dtt=0000-00-00"
FOR %%f IN ("%BoxIn%\%Mask%") DO Set Df=%%~nf &Call :LastFile "%%Df:~0,10%%" "%%~xf"
GoTo :Eof

:LastFile
        If "%Dtt%"==%1 GoTo :Eof
        Set "Dtt=%~1"
        Set "MaskData=%BoxIn%\%Dtt%*%~2"

        FOR /F "usebackq skip=1 delims=" %%f IN (`2^>nul Dir "%MaskData%" /B /A:-D /O:-D /T:W`) DO >nul Move "%BoxIn%\%%f" "%BoxOut%\"
GoTo :Eof

А если вообще не привязываться ко времени создания или изменения, а к номеру (но это медленнее)
Код:

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_Out"
Set "Mask=20??-??-??*.tif"

Set "Dtt=0000-00-00"
FOR %%f IN ("%BoxIn%\%Mask%") DO Set Df=%%~nf &Call :LastFile "%%Df:~0,10%%" "%%~xf"

GoTo :Eof

:LastFile
        If "%Dtt%"==%1 GoTo :Eof
        Set "Dtt=%~1"
        Set "MaskData=%BoxIn%\%Dtt%*%~2

        Set /A Max=0
        Set "NF=%~1%~2"
        FOR /F "usebackq tokens=1,2* delims=()" %%i IN (`2^>nul Dir "%MaskData%" /B /A:-D /O:-N`) DO If Not "%%k"=="" If !Max! LSS %%j Call Set /A Max=%%j &Set "NF=%%i(%%j)%%k"
        FOR %%i IN ("%MaskData%") DO If Not "%%~nxi"=="%NF%" Move /Y "%%i" "%BoxOut%\" >nul
GoTo :Eof



Время: 08:22.

Время: 08:22.
© OSzone.net 2001-