Показать полную графическую версию : Поиск самого свежего файла
Flyer61rus
25-05-2016, 23:21
Ребят, помогите написать bat файл, который бы искал самый свежие файл каждого расширения в указанной директории. То есть в папке Files находится много файлов разных расширений, например .doc, .excel, .txt и т.д. и таких файлов несколько. Так вот нужно найти самый свежий файл из .doc, .excel и так по всем расширениям. Вот бат файл, который ищет просто самый свежий файл, но как сделать, чтобы искал по каждому расширению не знаю. Если кто нибудь сделает, буду очень благодарен.
@echo off
for /f "delims=" %%i in ('dir C:\Files\ /B /A-D /OD /TA') do (set file=%%i)
echo %file%
pause
@echo off
for %%a in (docx txt bat) do dir/a-d/b/o-d/tc "C:\Files\*.%%a"|set/p x=^&cmd/v/c echo !x!
pause>nul
.
Flyer61rus
25-05-2016, 23:52
Код:
@echo off
for %%a in (docx txt bat) do dir/a-d/b/o-d/tc "C:\Files\*.%%a"|set/p x=^&cmd/v/c echo !x!
pause>nul »
Спасибо, но можно как нибудь сделать без указания конкретных расширений, чтобы учитывались все возможные расширения? Или такое в бат файле сделать невозможно?
Flyer61rus,
Понимаете ли, если я укажу любое расширение, то это равносильно тому - найти единственный самый свежий файл, а если есть желание перечислить все известные расширения - пожалуйста, берите из архива ниже и продолжайте список в for.
137041
Flyer61rus
26-05-2016, 00:41
»
В этом, собственно, и заключался вопрос, есть ли возможность указать в бат файле выборку по всем расширениям, не перечисляя каждое из возможных.
есть ли возможность указать в бат файле выборку по всем расширениям, не перечисляя каждое из возможных. »
Есть - name.*, я же указал выше, но это автоматически любой файл и самый свежий один единственный, тоже написал об этом, как еще объяснить.
самый свежий файл »
Переведите «самый свежий» — по дате создания, по дате последней модификации? По дате создания:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFolder=%~1
if defined sSourceFolder (
for %%i in ("%sSourceFolder%\*.*") do set sFoundExt%%~xi=%%~xi
for /f "usebackq tokens=2 delims==" %%i in (`set sFoundExt`) do for /f "usebackq delims=" %%j in (`2^>nul dir /b /a:-d /o:d /t:c "%sSourceFolder%\*%%~i"`) do set sFoundLastFileExt%%~i=%%j
for /f "usebackq tokens=2 delims==" %%i in (`set sFoundLastFileExt`) do echo %%~i
) else (
echo Usage: %~nx0 ^<Source folder^>
exit /b 1
)
endlocal
exit /b 0
Путь к исходной папке указывается параметром пакетного файла.
Flyer61rus
26-05-2016, 12:48
Переведите «самый свежий» — по дате создания, по дате последней модификации? По дате создания:
Скрытый текст »
Вот оно, то что нужно! Спасибо Вам большое, очень выручили! :yahoo:
Теперь только осталось самому посидеть поразбираться, что значат каждые параметры в этом коде) Еще раз большое Вам спасибо))
Вот оно, то что нужно! »
Не совсем то. Я давно не писал и потому совершенно забыл, что ещё потребно проверять само существование папки, переданной параметром.
что значат каждые параметры в этом коде »
Если не разберётесь — спрашивайте.
Общий подход выглядит следующим образом:
получаем перечень всех файлов и создаём по их расширениям переменные окружения вида «sFoundExt<.Расширение>»;
следующим шагом производим разбор всех созданных переменных окружения вида «sFoundExt<.Расширение>», извлекая для каждой из них отсортированный по дате создания перечень файлов из той же папки, но уже с определённым расширением;
имя каждого подходящего файла присваивается одной и той же переменной окружения вида «sFoundLastFileExt<.Расширение>», таким образом, имя файла, созданного последним, будет присвоено этой переменной окружения последним, в самом конце перебора;
и, наконец, производим разбор всех созданных переменных окружения вида «sFoundLastFileExt<.Расширение>», извлекая присвоенное каждой из них найденное имя последнего файла определённого расширения.
Flyer61rus
05-06-2016, 14:53
Если не разберётесь — спрашивайте. »
Добрый день, Iska! Извиняюсь, что спрашиваю уже спустя столько времени, но все же поясните пожалуйста как выполняется работа в этом коде. Мне бы буквально разобрать весь ход выполнения процесса в цикле. Можно даже на примере блок-схемы. :help: :help: :help:
if defined sSourceFolder (
for %%i in ("%sSourceFolder%\*.*") do set sFoundExt%%~xi=%%~xi »
Вот первый цикл. Объясните пожалуйста по шагам. Если я правильно понимаю, то если у нас существует папка, которую мы указываем через командную строку, то для всех файлов, находящихся в этой директории вводится новая переменная sFoundExt, которая... А вот что которая не понятно. Не могу разобраться что именно значит вот эта запись "sFoundExt%%~xi=%%~xi". Что за значение после равно? То что %~xi заменяет расширением имя файла %i понятно, но как это реализуется в данной строке? Почему написано через равно и почему %%, а не просто %?
Конечно, мои вопросы в некотором плане примитивны, но все же, если Вас не особо затруднит подробно рассказать о назначении и синтаксисе каждой переменной, буду очень благодарен.
Еще никак не могу разобраться с токенами. В нете почитал, но все же никак не пойму. Второй токен это значит, что в нашем случае будет выводиться %%~xi, так как находится после знака разделителя? Или что это значит?
Заранее большое спасибо Вам за ответ!
jenia_ov
23-12-2016, 07:36
Ребята!
Подскажите пожалуйста, как в этом коде использовать найденный файл для копирования в другую директорию.
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFolder=%~1
if defined sSourceFolder (
for %%i in ("%sSourceFolder%\*.txt") do set sFoundExt%%~xi=%%~xi
for /f "usebackq tokens=2 delims==" %%i in (`set sFoundExt`) do for /f "usebackq delims=" %%j in (`2^>nul dir /b /a:-d /o:d /t:c "%sSourceFolder%\*%%~i"`) do set sFoundLastFileExt%%~i=%%j
for /f "usebackq tokens=2 delims==" %%i in (`set sFoundLastFileExt`) do echo %%~i
for /f "usebackq tokens=3 delims==" %%i in (`set sFoundLastFileExt`) do copy %%~i d:\alfa.txt
) else (
echo Usage: %~nx0 ^<Source folder^>
exit /b 1
)
endlocal
exit /b
Поясню, требуется:
1) найти самый свежий файл с расширением txt в директории
2) скопировать найденный файл в другую директорию с переименованием в alfa.txt
3) если в директории назначения уже существует файл alfa.txt заменить его без подтверждения.
куда подставить txt для 1 пункта я понял, на 2 пункте сдулся, с 3 могу разобраться после того как узнаю имя/переменную в пункте 2.
jenia_ov, не тот тэг используете. Надо [code] (http://forum.oszone.net/misc.php?do=bbcode#code), а не [spoiler] (http://forum.oszone.net/misc.php?do=bbcode#spoiler).
1) найти самый свежий файл с расширением txt в директории »
«Свежий» — по дате создания или по дате модификации?
2) скопировать найденный файл в другую директорию с переименованием в alfa.txt »
Каким образом будет задаваться «другая директория»? Параметром или тупо в коде?
как в этом коде использовать »
Никак. Вам нужен другой код.
Вот пример для а) по дате создания и б) папки задаются параметрами:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFolder=%~1
set sDestFolder=%~2
set sNewFileName=alfa.txt
if defined sSourceFolder (
if defined sDestFolder (
if exist "%sSourceFolder%\." (
if exist "%sDestFolder%\." (
for /f "usebackq delims=" %%i in (
`2^>nul dir /b /a:-d /o:d /t:c "%sSourceFolder%\*.txt"`
) do if not defined sFoundFile set sFoundFile=%%i
if defined sFoundFile (
>nul copy /y "%sSourceFolder%\!sFoundFile!" "%sDestFolder%\%sNewFileName%"
) else (
echo No txt files found.
exit /b 4
)
) else (
echo Can't find destination folder [%sDestFolder%].
exit /b 3
)
) else (
echo Can't find source folder [%sSourceFolder%].
exit /b 2
)
) else (
echo Usage: %~nx0 ^<Source folder^> ^<Destination folder^>
exit /b 1
)
) else (
echo Usage: %~nx0 ^<Source folder^> ^<Destination folder^>
exit /b 1
)
endlocal
exit /b 0
jenia_ov
23-12-2016, 08:47
Iska, файл по дате создания, директории постоянные и неизменные, поэтому могу задаваться и в коде.
Ваш код полностью удовлетворяет потребности! Низкий Вам поклон!
jenia_ov, хорошо. Тогда вместо использования аргументов просто укажите Ваши конкретные пути вместо выделенного:
set sSourceFolder=%~1
set sDestFolder=%~2
jenia_ov
23-12-2016, 08:53
Iska, прошу прощения, сразу не обратил внимание, копируется самый старый файл почему-то.
Да, так и сделал, сначала кинулся ярлык сделал и пути прописал, потом только в код вписал каталоги.
jenia_ov, попробуйте добавить «-» в «/o:d» в строку:
`2^>nul dir /b /a:-d /o:d /t:c "%sSourceFolder%\*.txt"`
чтобы стало «/o:-d»:
`2^>nul dir /b /a:-d /o:-d /t:c "%sSourceFolder%\*.txt"`
jenia_ov
23-12-2016, 09:01
Iska, Огромное спасибо, все отлично!
jenia_ov, ну, Вы таки попроверяйте всё ж. Может, окажется, что нужна была не дата создания…
jenia_ov
23-12-2016, 09:32
Iska,
Суть процесса - с сайта клиент банка сохраняется выписка по счету в txt файле, поскольку работа идет из браузера chrome - он сохраняет эту выписку в папку Загрузки, как и все что скачивается через него. С помощью этого батника, самый свежий по дате создания txt файл копируется в расшаренную папку на сервере с 1С откуда и осуществляется загрузка этого файла. Выписка из банка всегда с разным именем файла (подставляется дата выписки). А поскольку txt файлы на том компе больше никто не качает, то это решение более чем подходит.
Vasya1998
16-08-2018, 17:03
попробуйте добавить »
Помогите, пожалуйста, переписать батник таким образом, чтобы он находил последний созданный файл во вложенных папках. Я нашёл решение чтобы копировались все файлы из вложенных папок:
for /f "tokens=*" %%i in (' dir /b /s /ad "C:\SourceMainDir\" ') do xcopy /e "%%i" "C:\DestinationDir\"
но никак не получается соединить с кодом из этой темы так, чтобы из вложенных папок выбирался только самый последний созданный файл.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.