Показать полную графическую версию : Поиск файлов *.cer с заданной датой создания
Альберт_25
10-08-2015, 17:30
Всем привет, ребят помогите пожалуйста наваять батник со следующим функционалом.
1) запускаем батник и он просит ввести с клавиатуры дату в формате дд.мм.гг
2) ищет на диске и во всех под каталогах X:\Файлы\Сертификаты\*.cer файлы с расширением *.cer, но на диске X есть под каталоги X:\Файлы\Сертификаты\OLD и X:\Файлы\OLD в них искать не нужно (не нужно искать в папках OLD)
3) выводит список всех найденных файлов *.cer с заданной датой создания
4) и еще хотелось бы что бы русский язык выводился нормально а не иероглифами, потому что сертификаты и пути к ним пишутся на русском языке.
и можно ещё их посчитать,
Например:
Было найдено:
1) X:\Файлы\Сертификаты\Женя\сертификат.cer
2) X:\Файлы\Сертификаты\Маша\ВходБаза.cer
Итого найдено: 2 сертификата.
Я думаю для знающего человека эта задача простая, я к сожалению таким не являюсь.
Спасибо за понимание и помощь)
Бред конечно, но...
@echo off
echo Введите дату в формате DD.MM.YYYY
set /p dt=
pushd="d:\test"
for /f "tokens=4-5" %b in ('dir /o:d /t:c /a:-d /s *.cer ^| find "%dt%"') do for /f "delims=" %a in ('dir /a:-d /s /b %b') do echo %~fa | find /v /i "old"
pause > NUL
popd
exit /b 0
Однако если есть файлы с одинаковыми именами лежащие в разных папках, будет уже неправда. Вообще какие-то танцы на костылях получились.
вместо d:\test подставить нужный диск/каталог
чтобы избежать иероглифов сохранить батник в 866 кодировке.
Альберт_25
11-08-2015, 11:40
Однако если есть файлы с одинаковыми именами лежащие в разных папках, будет уже неправда. »
Таких файлов нету)
Спасибо большое за внимание к моей проблеме, но почему то не получилось, я забиваю дату и ничего не происходит...
Как вариант файлов с такой датой создания нет. Попробуйте из командной строки из каталога с файлами запустить
dir /o:d /t:c /a:-d /s *.cer
будут выведены все файлы с расширением .cer отсортированные по дате создания.
Альберт_25
11-08-2015, 13:23
Elven, я проверил наличие в одной из папок файла сертификата с сегодняшней датой создания, а батничек почему то его не видит, не подскажете что ещё может быть не так?
Elven, а может можно все строчки которые он собрал записать в TXT файл?
@echo off
echo Введите дату в формате DD.MM.YYYY
set /p dt=
pushd="d:\test"
for /f "tokens=4-5" %%b in ('dir /o:d /t:c /a:-d /s *.cer ^| find "%dt%"') do for /f "delims=" %%a in ('dir /a:-d /s /b %%b') do echo %%~fa | find /v /i "old" >> log.txt
pause > NUL
popd
exit /b 0
Так будет в файл. Ну и так исправил койчаво.
1) запускаем батник и он просит ввести с клавиатуры дату в формате дд.мм.гг
2) ищет на диске и во всех под каталогах X:\Файлы\Сертификаты\*.cer файлы с расширением *.cer, но на диске X есть под каталоги X:\Файлы\Сертификаты\OLD и X:\Файлы\OLD в них искать не нужно (не нужно искать в папках OLD)
3) выводит список всех найденных файлов *.cer с заданной датой создания
4) и еще хотелось бы что бы русский язык выводился нормально а не иероглифами, потому что сертификаты и пути к ним пишутся на русском языке.
и можно ещё их посчитать,
Например:
Было найдено:
1) X:\Файлы\Сертификаты\Женя\сертификат.cer
2) X:\Файлы\Сертификаты\Маша\ВходБаза.cer
Итого найдено: 2 сертификата. »
:: Пакетный файл с данным кодом сохраните в кодировке "OEM-866"!
@echo off& setlocal
set "dir=X:\"
:: Присвоение переменной "exclude" исключений в качестве значения (обратите внимание на точки с запятой):
set exclude="X:\Файлы\Сертификаты\OLD";"X:\Файлы\OLD";
echo Введите дату в формате "дд.мм.гг" или "дд.мм.гггг" (без кавычек).
set/p "$date="& cls& if not defined $date exit/b 1
cmd/v/c echo.!$date!| ^
findstr/x "[0-3][0-9]\.[0-1][0-9]\.[0-9][0-9] [0-3][0-9]\.[0-1][0-9]\.[0-9][0-9][0-9][0-9]"&& ^
echo.|| exit/b 2
pushd "%dir%"&& set n=0|| exit/b 3
for /f "delims=" %%i in ('2^>nul dir/a-d/b/s "*.cer"^| findstr/ilv /c:%exclude:";=\\" /c:%?') do (
for /f "delims=" %%j in ('dir/a/-c/tc "%%i"^| findstr/b %$date:.=.[0-9]*%') do (
set/a n+=1
cmd/c set/a n& echo ^) %%i
)
)
popd& echo.& echo Итого найдено: %n% сертификат (-а, -ов).
pause>nul& endlocal& exit/b 0
Альберт_25
12-08-2015, 08:29
Georgio, Elven, вы конечно бесспорно шарите в Бат файлах и т.п., но у меня почему то это не работает...
set exclude="X:\Файлы\Сертификаты\OLD";"X:\Файлы\OLD"; » кстати у меня есть пакпи с большей глубиной вложения, X:\Файлы\Сертификаты\офис\OLD, это важно?
есть пакпи с большей глубиной вложения, это важно »
нет.
у меня почему то это не работает »
карма...
Альберт_25, вот этот код должен работать, в изначальном, признаю, допустил одну ошибку. Точнее две, но одинаковые ;).
С кода Georgio я, как всегда, косею (в хорошем смысле). На всякий случай, Georgio, Вы часом не матерый комп с ИИ? Местами кажется, что батник писался не построчно, а как-то весь сразу, а комментарии были добавлены потом чтобы "Эти тупые человеки поняли что здесь происходит".
На всякий случай, Georgio, Вы часом не матерый комп с ИИ? Местами кажется, что батник писался не построчно, а как-то весь сразу, а комментарии были добавлены потом чтобы "Эти тупые человеки поняли что здесь происходит". »
Elven, могу Вас заверить, что коллега Georgio живой (и не ленивый) человек.
Альберт_25
12-08-2015, 11:22
Georgio, а можешь немного подправить батничек, просто он ищет файлы в папках OLD, а мне там не нужно искать...
у меня много папок с вот такой структурой:
X:\Файлы\Сертификаты\биржа\OLD
X:\Файлы\Сертификаты\торг\OLD
X:\Файлы\Сертификаты\хрень\OLD
и т.д.
Альберт_25, может просто в начале батника выставить?
chcp 1251
или 866, а ещё, кодировка, в которой записано.
У вас всё на русском. Не понимаю этой тенденции писать имена папок на русском. Хоть это и удобно, но это не правильно.
Альберт_25
12-08-2015, 11:53
Elven, спасибо за код, всё заработало)
Код:
@echo off
echo Введите дату в формате DD.MM.YYYY
set /p dt=
pushd="d:\test"
for /f "tokens=4-5" %%b in ('dir /o:d /t:c /a:-d /s *.cer ^| find "%dt%"') do for /f "delims=" %%a in ('dir /a:-d /s /b %%b') do echo %%~fa | find /v /i "old" >> log.txt
pause > NUL
popd
exit /b 0 »
у меня у сертификатов есть дата создания и дата изменения, он ищет по дате создания, а можно поставить что бы он искал по дате последнего изменения?)
Если отдельно то отдельно это то вот здесь
dir /o:d /t:c /a:-d /s *.cer
поменять на вот так
dir /o:d /t:w /a:-d /s *.cer
А чтобы одновременно... Ну в принципе можно: на пару строчек больше сделать и другие переменные вписать.
@echo off
echo Введите дату в формате DD.MM.YYYY
set /p dt=
pushd="d:\test"
echo Дата создания %dt% >> log.txt
for /f "tokens=4-5" %%b in ('dir /o:d /t:c /a:-d /s *.cer ^| find "%dt%"') do for /f "delims=" %%a in ('dir /a:-d /s /b %%b') do echo %%~fa | find /v /i "old" >> log.txt
echo Дата изменения %dt% >> log.txt
for /f "tokens=4-5" %%c in ('dir /o:d /t:w /a:-d /s *.cer ^| find "%dt%"') do for /f "delims=" %%d in ('dir /a:-d /s /b %%c') do echo %%~fd | find /v /i "old" >> log.txt
pause > NUL
popd
exit /b 0
Альберт_25
12-08-2015, 12:01
Вот здесь
Код:
dir /o:d /t:c /a:-d /s *.cer
поменять на вот так
Код:
dir /o:d /t:w /a:-d /s *.cer »
благодарю
@echo off
echo Введите дату в формате DD.MM.YYYY
set /p dt=
pushd="d:\test"
echo Дата создания %dt% >> log.txt
for /f "tokens=4-5" %%b in ('dir /o:d /t:c /a:-d /s *.cer ^| find "%dt%"') do for /f "delims=" %%a in ('dir /a:-d /s /b %%b') do echo %%~fa | find /v /i "old" >> log.txt
echo Дата изменения %dt% >> log.txt
for /f "tokens=4-5" %%c in ('dir /o:d /t:w /a:-d /s *.cer ^| find "%dt%"') do for /f "delims=" %%d in ('dir /a:-d /s /b %%c') do echo %%~fd | find /v /i "old" >> log.txt
pause > NUL
popd
exit /b 0 »
всё классно, но почему то батнику пофиг на дату он выдаёт все файлы с расширением .cer, а мне нужны только те которые изменены в конкретную дату которую я задам
Альберт_25, Делал батник копирования файлов по дате создания - 3дня, может вдохновит на что-нибудь: @echo off
setlocal enabledelayedexpansion
set "qw=%Userprofile%\Desktop\Test"
rem Для изменения у всех файлов даты "модификации" "обращения" [на текущую]
"nircmd" setfiletime "%qw%\*" "" now now
rem Убираем лидирующий "0" из даты, если есть
for /f "tokens=* delims=0" %%d in ("%date%") do (
set onosdate=%%d
rem Модифицируем дату к виду: "текущая дата-3(дня)"
for /f "tokens=1-3 delims=.: " %%a in ("!onosdate!") do (
rem У кого английская поменять на %%c%%b%%a
set sdate=%%a%%b%%c
rem У кого английская %%c%%b
set dnoa=%%b%%c
set range=3
set /a newa=%%a-!range!
rem У кого английская !dnoa!!newa!
set newsdate=!newa!!dnoa!))
rem Выделяем "дату создания" "имя" и "расширение" файлов (очень важна сортировка по дате и времени, порядок не важен)
for /f "tokens=1-8 delims=.: " %%i in ('dir/a-d/o-d/tc "%qw%"^| findstr/rc:"^[^ ]"') do (
rem У кого английская %%k%%j%%i
set mydate=%%i%%j%%k
rem Убираем лидирующий "0" из даты, если есть
for /f "tokens=* delims=0" %%q in ("!mydate!") do (
set onomydate=%%q
set "namemydate=%%o.%%p%%q"
rem Сравниваем "имя" "расширение" "заданная дата" = "имя" "расширение" "дата создания" файла
if "%%o.%%p%newsdate%"=="!namemydate!" (
rem Дальше вольны делать с файлами, что захотим, например:
copy "%qw%\%%o.%%p" "%Userprofile%\Desktop\Folder\")))
exit.
nircmd надо скачать здесь (http://www.nirsoft.net/utils/nircmd.html)
почему то батнику пофиг на дату »
Как говаривал Станиславский - "Не верю!"
вот эта команда
dir /o:d /t:c /a:-d /s *.cer
действительно находит все файлы с расширениием *.cer и сортирует их по дате создания, а вот эта команда
| find "%dt%"
находит все строчки в которых встречается дата указанная в переменной %dt%
Для пущей чистоты эксперимента можно запустить прямо из командной строки
dir /o:d /t:c /a:-d /s *.cer ^| find "13.08.2015"
(вместо указанной для примера даты вводим ту которую надо) и посмотреть что же будет на выходе.
Вдруг у него региональные стандарты иные?!
но почему то батнику пофиг на дату он выдаёт все файлы с расширением .cer, а мне нужны только те которые изменены в конкретную дату которую я задам »
А вот я почему-то верю.
В первом цикле (for /f "tokens=4-5" %%b in ('dir /o:d /t:c /a:-d /s *.cer ^| find "%dt%"') do)
действительно определяются имена (именно имена, а не полные имена) файлов, соответствующие дате создания, но вот затем это имя передаётся для разбора во второй цикл, в котором и происходит не то, что нужно ТС.
Во втором цикле (for /f "delims=" %%a in ('dir /a:-d /s /b %%b') do echo %%~fa | find /v /i "old")
происходит поиск всех файлов, соответствующих данному имени и не являющихся исключениями, и дата создания уже полностью игнорируется.
Georgio, поэтому я и предупредил что если есть файлы с одинаковыми именами, то мой вариант не прокатит.
Однако если есть файлы с одинаковыми именами лежащие в разных папках, будет уже неправда.»
На что получил ответ
Таких файлов нету) »
Однако, Georgio, в любом случае спасибо за конструктивную критику.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.