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

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

Ответить
Настройки темы
CMD/BAT - [решено] Вывод имен файлов за последние N дней

Аватара для Elven

Ветеран


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

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


Изменения
Автор: Elven
Дата: 30-05-2014
Имеем папку, в ней некоторое количество файлов. Нужно вывести, например, в файл имена файлов созданных измененных в последние, например, 5 (50, 500) дней.
Игрался с forfiles но он, гад, или хочет смотреть в будущее, или в далекое прошлое, или пляшет от фиксированной даты (или я какого ключа не заметил?).

Отправлено: 18:36, 29-05-2014

 

Ветеран


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

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


Цитата Elven:
файлов созданных »
Цитата:
Selects files with a last modified date within the specified time frame
Используйте WSH, PoSH или стороннюю утилиту (буде таковая).

LogParser:
Код: Выделить весь код
"C:\Program Files\Log Parser 2.2\LogParser.exe" "SELECT Name, Path, CreationTime FROM 'C:\Windows\System32\*.*' WHERE CreationTime >= TO_LOCALTIME(SUB(SYSTEM_TIMESTAMP(), TO_TIMESTAMP(MUL(MUL(MUL(60, 60), 24), 5)))) ORDER BY Name ASC" -i:FS -recurse:0 -q:ON

Последний раз редактировалось Iska, 29-05-2014 в 19:56. Причина: Таковая есть ;)


Отправлено: 19:33, 29-05-2014 | #2



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

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


Аватара для Elven

Ветеран


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

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


Категорически извиняюсь, Iska, совершенно правильно, измененных, а не созданных.

Отправлено: 12:33, 30-05-2014 | #3


Ветеран


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

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


Ну, так используйте в таком случае «forfiles.exe»:
Цитата:
/d [{+|-}][{<Date>|<Days>}]

Selects files with a last modified date later than or equal to (+) the current date plus the number of days specified, or earlier than or equal to (-) the current date minus the number of days specified.
В примерах:
Цитата:
To list all of the files in the current directory that are at least one year old, type:
Код: Выделить весь код
forfiles /s /m *.* /d -365 /c "cmd /c echo @file is at least one year old."
У Вас будет не «-365», а «-5», «-50», «-500».

Отправлено: 15:38, 30-05-2014 | #4


Аватара для Elven

Ветеран


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

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


Iska, таки вы меня не так поняли. Мне нужно искать не те файлы которые больше N дней не изменялись, а наоборот те которые менялись в течение последних N дней

Накопал тут занятную функцию. Таким образом конечный вариант стал выглядеть таким образом.
Код: Выделить весь код
@echo off
set RD=d:\
Call :FromNow -100
forfiles /S /D +%yyyymmdd% /P "%RD%">>files.txt
Exit /B

:FromNow
 SetLocal
 Set yyyy=%DATE:~-4%& set /a mm=100%DATE:~3,2%%%100& set /a dd=100%DATE:~,2%%%100
 Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
 Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
 Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
 Set /A J=J+2-12*L,I=100*(N-49)+I+L
 Set /A yyyy=I,mm=100+J,dd=100+K
 EndLocal& Set yyyymmdd=%dd:~-2%.%mm:~-2%.%yyyy%
Exit /B

Отправлено: 15:39, 30-05-2014 | #5


Ветеран


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

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


Elven, ясно. Я неправильно понял. Поменяйте в примере «-» на «+».

У меня не Windows 7, посему «forfiles.exe» доступен только из комплекта Resource Kit'ов, с заметно отличающимся синтаксисом. В моём случае может выглядеть так:
Код: Выделить весь код
"%ProgramFiles%\Resource Kit\forfiles.exe" -pc:\Windows\System32 -m*.* -d+50 -c"cmd /c if /i @ISDIR equ FALSE echo @FILE, @PATH, @FDATE @FTIME"
читать дальше »
Цитата:
Код: Выделить весь код
imdisk.cpl, c:\Windows\System32, 20140501 91610
imdisk.exe, c:\Windows\System32, 20140501 93038
imdsksvc.exe, c:\Windows\System32, 20140417 221022
MediaInfo.dll, c:\Windows\System32, 20140424 131004


Для сравнения результатов — «LogParser»:
Код: Выделить весь код
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" "SELECT Name, Path, LastWriteTime, Attributes FROM 'C:\Windows\System32\*.*' WHERE LastWriteTime >= TO_LOCALTIME(SUB(SYSTEM_TIMESTAMP(), TO_TIMESTAMP(MUL(MUL(MUL(60, 60), 24), 50)))) AND Attributes NOT LIKE 'D________' ORDER BY Name ASC" -i:FS -recurse:0 -q:ON
читать дальше »
Цитата:
Код: Выделить весь код
MediaInfo.dll C:\Windows\System32\MediaInfo.dll 2014-04-24 17:10:04.0   -A-------
imdisk.cpl    C:\Windows\System32\imdisk.cpl    2014-05-01 13:16:08.581 -A-------
imdisk.exe    C:\Windows\System32\imdisk.exe    2014-05-01 13:30:36.906 -A-------
imdsksvc.exe  C:\Windows\System32\imdsksvc.exe  2014-04-18 02:10:20.910 -A-------

Отправлено: 16:31, 30-05-2014 | #6


Аватара для Elven

Ветеран


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

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


Пробовал уже, если использовать плюс forfiles выдает список файлов созданных в будущем (ей-ей не прикалываюсь), менял дату изменения на некоторое время вперед - начинают отображаться. Хотелось бы спросить у мелкомягих два извечных вопроса один из которых "как", а второй будет вырезан цензурой, но боюсь что не ответят.

Отправлено: 16:49, 30-05-2014 | #7


Ветеран


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

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


Цитата Elven:
если использовать плюс forfiles выдает список файлов созданных в будущем (ей-ей не прикалываюсь), »
И «список файлов созданных в будущем». Естественно. А как Вы полагаете должно выполняться условие: «файлы, изменённые позже даты (текущая дата — 50 дней)»? Только так.

Кстати, а откуда у Вас могут взяться файлы, изменённые позже текущей даты? Это ведь нонсенс. Записью этой даты управляет сама ОС при модификации файлов.

P.S. Если Вам настоятельно нужно добавить условие «И не позже текущей даты» — используйте LogParser.

читать дальше »
Я добавил файл и «ручками» задал ему дату модификации в будущем:
Код: Выделить весь код
╔══════════════════════════ Атрибуты ══════════════════════════╗
║                  Изменить файловые атрибуты                  ║
║                           0001.txt                           ║
╟──────────────────────────────────────────────────────────────╢
║ Владелец:    XXXXXXXXXXXXXXX                                 ║
╟──────────────────────────────────────────────────────────────╢
║ [ ] Только для чтения         [ ] Неиндексируемый            ║
║ [x] Архивный                  [ ] Разреженный                ║
║ [ ] Скрытый                   [ ] Временный                  ║
║ [ ] Системный                 [ ] Автономный                 ║
║ [ ] Сжатый                    [ ] Точка повторной обработки  ║
║ [ ] Зашифрованный             [ ] Виртуальный                ║
╟──────────────────────────────────────────────────────────────╢
║                                     ДД.ММ.ГГГГГ чч:мм:сс.мс  ║
║ Время последней записи:             01.06.2014  17:45:33.239 ║
║ Время создания:                     30.05.2014  17:45:33.239 ║
║ Время последнего доступа:           30.05.2014  17:45:33.239 ║
║ Время изменения:                    01.06.2014  17:45:33.239 ║
║              [ Исходное ] [ Текущее ] [ Сброс ]              ║
╟──────────────────────────────────────────────────────────────╢
Предыдущий код:
Код: Выделить весь код
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" "SELECT Name, Path, LastWriteTime, Attributes FROM 'C:\Windows\System32\*.*' WHERE LastWriteTime >= TO_LOCALTIME(SUB(SYSTEM_TIMESTAMP(), TO_TIMESTAMP(MUL(MUL(MUL(60, 60), 24), 50)))) AND Attributes NOT LIKE 'D________' ORDER BY Name ASC" -i:FS -recurse:0 -q:ON
«видит» его:
Цитата:
Код: Выделить весь код
0001.txt      C:\Windows\System32\0001.txt      2014-06-01 17:45:33.239 -A-------
MediaInfo.dll C:\Windows\System32\MediaInfo.dll 2014-04-24 17:10:04.0   -A-------
imdisk.cpl    C:\Windows\System32\imdisk.cpl    2014-05-01 13:16:08.581 -A-------
imdisk.exe    C:\Windows\System32\imdisk.exe    2014-05-01 13:30:36.906 -A-------
imdsksvc.exe  C:\Windows\System32\imdsksvc.exe  2014-04-18 02:10:20.910 -A-------
Добавляем в код вышеназванное условие:
Код: Выделить весь код
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" "SELECT Name, Path, LastWriteTime, Attributes FROM 'C:\Windows\System32\*.*' WHERE LastWriteTime >= TO_LOCALTIME(SUB(SYSTEM_TIMESTAMP(), TO_TIMESTAMP(MUL(MUL(MUL(60, 60), 24), 50)))) AND LastWriteTime <= TO_LOCALTIME(SYSTEM_TIMESTAMP()) AND Attributes NOT LIKE 'D________' ORDER BY Name ASC" -i:FS -recurse:0 -q:ON
Результат — файл, изменённый в будущем, в выводе теперь отсутствует:
Цитата:
Код: Выделить весь код
MediaInfo.dll C:\Windows\System32\MediaInfo.dll 2014-04-24 17:10:04.0   -A-------
imdisk.cpl    C:\Windows\System32\imdisk.cpl    2014-05-01 13:16:08.581 -A-------
imdisk.exe    C:\Windows\System32\imdisk.exe    2014-05-01 13:30:36.906 -A-------
imdsksvc.exe  C:\Windows\System32\imdsksvc.exe  2014-04-18 02:10:20.910 -A-------

Отправлено: 17:51, 30-05-2014 | #8


Пользователь


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

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


Georgio, Вы всегда такие интересные конструкции приводите. еще бы комментариями снабжали, было бы в разы интереснее

Отправлено: 13:04, 02-06-2014 | #9


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


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

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


Добрый день! похожая проблема, имеется

Код: Выделить весь код
forfiles /p C:\files\work  /d -17 /c "cmd /c echo @path">d:\files\1.txt
в файл выводит абсолютно все файлы из папки, по дате не отбирает

Цитата Georgio:
Код:
@echo off
set "directory=D:\some folder"
set days=50
forfiles /p "%directory%" /c "cmd /c if /i @isdir==false echo @file" /d -%days%>.tmp 2>nul
(
for /f "delims=" %%i in ('
dir /a-d /b "%directory%" 2^>nul
') do (
findstr /lxc:"\"%%i\"" .tmp>nul|| (
echo %%~nxi
)
)
)>"some file"
del .tmp
exit /b »
по этому коду выводит только название самих файлов, а необходим полный путь, как не пробЫвал ни чего не выходит.

Отправлено: 10:35, 29-03-2016 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Вывод в файл имен последних файлов в папках ivanxam Скриптовые языки администрирования Windows 2 01-10-2013 13:26
2008 R2 - Windows 2008. Пропала вся информация и все изменения за последние 1,5 месяца alexpetrovich Windows Server 2008/2008 R2 1 18-09-2013 20:31
Деятельность Sony оказалась прибыльной впервые за последние пять лет OSZone News Новости информационных технологий 0 09-05-2013 13:30
VBS/WSH/JS - [решено] Удаление файлов по сети старше 7 дней, оставлять не менее 10 файлов white155 Скриптовые языки администрирования Windows 6 04-01-2012 00:42
Рекордный за последние 52 недели курс акций компании AMD OSZone News Новости информационных технологий 0 17-12-2009 21:30




 
Переход