Войти

Показать полную графическую версию : [решено] Вывод имен файлов за последние N дней


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

Iska
29-05-2014, 19:33
файлов созданных »
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

Elven
30-05-2014, 12:33
Категорически извиняюсь, Iska, совершенно правильно, измененных, а не созданных.

Iska
30-05-2014, 15:38
Ну, так используйте в таком случае «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».

Elven
30-05-2014, 15:39
Iska, таки вы меня не так поняли. Мне нужно искать не те файлы которые больше N дней не изменялись, а наоборот те которые менялись в течение последних N дней

Накопал тут (http://forum.oszone.net/thread-186889.html) занятную функцию. Таким образом конечный вариант стал выглядеть таким образом.

@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

Iska
30-05-2014, 16:31
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-------

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

Iska
30-05-2014, 17:51
если использовать плюс 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-------

firstarey
02-06-2014, 13:04
Georgio, Вы всегда такие интересные конструкции приводите. еще бы комментариями снабжали, было бы в разы интереснее :)

yurkind15
29-03-2016, 10:35
Добрый день! похожая проблема, имеется

forfiles /p C:\files\work /d -17 /c "cmd /c echo @path">d:\files\1.txt

в файл выводит абсолютно все файлы из папки, по дате не отбирает

Код:
@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 »

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

Foreigner
29-03-2016, 15:31
в файл выводит абсолютно все файлы из папки, по дате не отбирает »
Значит все файлы подходят под критерий поиска. Что показывает @fdate?

forfiles /p C:\files\work /d -17 /c "cmd /c echo @fdate: @path">d:\files\1.txt

yurkind15
29-03-2016, 15:45
просмотрел, я то думал будет выводить файлы за последние 17 дней, а тут наоборот))

yurkind15
29-03-2016, 16:01
А как тогда переделать этот код, чтобы выводился полный путь к файлам? Заменяю @file на @path и код не работает(( ну или какой то другой вариант, а то всю голову уже сломал

@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

Foreigner
29-03-2016, 16:25
а тут наоборот)) »
Тогда надо либо рассчитывать дату, а это все через задницу, либо исходить от обратного:

@echo off
setlocal

set "days=17"
pushd "D:\some folder"

1>"%temp%\forfiles.tmp" (
for /f "tokens=*" %%i in ('forfiles /d -%days% /c "cmd /c echo @file"') do echo %%~i
)

for /f "tokens=*" %%i in (' "dir /b /a-d | findstr /v /g:"%temp%\forfiles.tmp"" ') do echo %%~fi

popd
del "%temp%\forfiles.tmp"

yurkind15
30-03-2016, 10:36
Foreigner, Спасибо!!!

инспектор
08-05-2020, 08:44
cmd+Powershell
https://issue.life/questions/57429733




© OSzone.net 2001-2012