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

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

Альберт_25 10-08-2015 17:30 2539678

Поиск файлов *.cer с заданной датой создания
 
Всем привет, ребят помогите пожалуйста наваять батник со следующим функционалом.

1) запускаем батник и он просит ввести с клавиатуры дату в формате дд.мм.гг

2) ищет на диске и во всех под каталогах X:\Файлы\Сертификаты\*.cer файлы с расширением *.cer, но на диске X есть под каталоги X:\Файлы\Сертификаты\OLD и X:\Файлы\OLD в них искать не нужно (не нужно искать в папках OLD)

3) выводит список всех найденных файлов *.cer с заданной датой создания

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

и можно ещё их посчитать,
Например:
Было найдено:
1) X:\Файлы\Сертификаты\Женя\сертификат.cer
2) X:\Файлы\Сертификаты\Маша\ВходБаза.cer
Итого найдено: 2 сертификата.

Я думаю для знающего человека эта задача простая, я к сожалению таким не являюсь.
Спасибо за понимание и помощь)

Elven 11-08-2015 11:27 2539930

Бред конечно, но...
Код:

@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 2539934

Цитата:

Цитата Elven
Однако если есть файлы с одинаковыми именами лежащие в разных папках, будет уже неправда. »

Таких файлов нету)

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

Elven 11-08-2015 11:54 2539945

Как вариант файлов с такой датой создания нет. Попробуйте из командной строки из каталога с файлами запустить
Код:

dir /o:d /t:c /a:-d /s *.cer
будут выведены все файлы с расширением .cer отсортированные по дате создания.

Альберт_25 11-08-2015 13:23 2539982

Elven, я проверил наличие в одной из папок файла сертификата с сегодняшней датой создания, а батничек почему то его не видит, не подскажете что ещё может быть не так?

Elven, а может можно все строчки которые он собрал записать в TXT файл?

Elven 11-08-2015 15:05 2540032

Код:

@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

Так будет в файл. Ну и так исправил койчаво.

Georgio 11-08-2015 21:27 2540262

Цитата:

Цитата Альберт_25
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 2540460

Georgio, Elven, вы конечно бесспорно шарите в Бат файлах и т.п., но у меня почему то это не работает...

Цитата:

Цитата Georgio
set exclude="X:\Файлы\Сертификаты\OLD";"X:\Файлы\OLD"; »

кстати у меня есть пакпи с большей глубиной вложения, X:\Файлы\Сертификаты\офис\OLD, это важно?

Elven 12-08-2015 08:47 2540465

Цитата:

Цитата Альберт_25
есть пакпи с большей глубиной вложения, это важно »

нет.
Цитата:

Цитата Альберт_25
у меня почему то это не работает »

карма...
Альберт_25, вот этот код должен работать, в изначальном, признаю, допустил одну ошибку. Точнее две, но одинаковые ;).
С кода Georgio я, как всегда, косею (в хорошем смысле). На всякий случай, Georgio, Вы часом не матерый комп с ИИ? Местами кажется, что батник писался не построчно, а как-то весь сразу, а комментарии были добавлены потом чтобы "Эти тупые человеки поняли что здесь происходит".

Iska 12-08-2015 09:25 2540475

Цитата:

Цитата Elven
На всякий случай, Georgio, Вы часом не матерый комп с ИИ? Местами кажется, что батник писался не построчно, а как-то весь сразу, а комментарии были добавлены потом чтобы "Эти тупые человеки поняли что здесь происходит". »

Elven, могу Вас заверить, что коллега Georgio живой (и не ленивый) человек.

Альберт_25 12-08-2015 11:22 2540539

Georgio, а можешь немного подправить батничек, просто он ищет файлы в папках OLD, а мне там не нужно искать...
у меня много папок с вот такой структурой:
X:\Файлы\Сертификаты\биржа\OLD
X:\Файлы\Сертификаты\торг\OLD
X:\Файлы\Сертификаты\хрень\OLD
и т.д.

yurfed 12-08-2015 11:41 2540548

Альберт_25, может просто в начале батника выставить?
Код:

chcp 1251
или 866, а ещё, кодировка, в которой записано.
У вас всё на русском. Не понимаю этой тенденции писать имена папок на русском. Хоть это и удобно, но это не правильно.

Альберт_25 12-08-2015 11:53 2540557

Elven, спасибо за код, всё заработало)

Цитата:

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

у меня у сертификатов есть дата создания и дата изменения, он ищет по дате создания, а можно поставить что бы он искал по дате последнего изменения?)

Elven 12-08-2015 11:57 2540559

Если отдельно то отдельно это то вот здесь
Код:

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 2540561

Цитата:

Цитата Elven
Вот здесь
Код:
dir /o:d /t:c /a:-d /s *.cer
поменять на вот так
Код:
dir /o:d /t:w /a:-d /s *.cer »

благодарю

Цитата:

Цитата Elven
@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, а мне нужны только те которые изменены в конкретную дату которую я задам

alpap 12-08-2015 19:31 2540831

Альберт_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 надо скачать здесь

Elven 13-08-2015 08:46 2541010

Цитата:

Цитата Альберт_25
почему то батнику пофиг на дату »

Как говаривал Станиславский - "Не верю!"
вот эта команда
Код:

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"
(вместо указанной для примера даты вводим ту которую надо) и посмотреть что же будет на выходе.

Iska 13-08-2015 09:38 2541033

Вдруг у него региональные стандарты иные?!

Georgio 13-08-2015 09:49 2541036

Цитата:

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

Elven 13-08-2015 10:00 2541039

Georgio, поэтому я и предупредил что если есть файлы с одинаковыми именами, то мой вариант не прокатит.
Цитата:

Цитата Elven
Однако если есть файлы с одинаковыми именами лежащие в разных папках, будет уже неправда.»

На что получил ответ
Цитата:

Цитата Альберт_25
Таких файлов нету) »

Однако, Georgio, в любом случае спасибо за конструктивную критику.

Georgio 13-08-2015 10:25 2541047

Цитата:

Цитата Альберт_25
Georgio, а можешь немного подправить батничек, просто он ищет файлы в папках OLD, а мне там не нужно искать...
у меня много папок с вот такой структурой:
X:\Файлы\Сертификаты\биржа\OLD
X:\Файлы\Сертификаты\торг\OLD
X:\Файлы\Сертификаты\хрень\OLD
и т.д. »



Код:

:: Пакетный файл с данным кодом сохраните в кодировке "OEM-866"!

@echo off& setlocal

set "dir=X:\"

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"^| find/i /v "\old\"') 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 13-08-2015 10:57 2541058

Цитата:

Цитата Elven
Однако если есть файлы с одинаковыми именами лежащие в разных папках, будет уже неправда.»
На что получил ответ
Цитата Альберт_25:
Таких файлов нету) » »

а если есть файлы с одинаковыми именами, как будет правильно?

Georgio 13-08-2015 11:27 2541068

Цитата:

Цитата Альберт_25
а если есть файлы с одинаковыми именами, как будем правильно? »



Основываясь на логике построения алгоритма, воплощённого в тот код, "правильно" не получится.

Альберт_25 13-08-2015 12:12 2541085

Цитата:

Цитата Georgio
Основываясь на логике построения алгоритма, воплощённого в тот код, "правильно" не получится. »

Мне не очень удобно тебя о чем либо просить, и так много хорошего сделал, но если вдруг у тебя появится время, а главное желание, смог бы ты написать код который сможет найти такие файлы?)

Georgio 13-08-2015 12:27 2541090

Цитата:

Цитата Альберт_25
смог бы ты написать код который сможет найти такие файлы? »



Уже написал. Смотри выше.

Альберт_25 13-08-2015 13:16 2541118

Georgio, знаешь я её уже засовывал в Батник и запускал, она очень долго висит и ничего не происходит, я что то не так сделал?


Время: 19:47.

Время: 19:47.
© OSzone.net 2001-