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

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

Elven 29-05-2014 18:36 2357393

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

Iska 29-05-2014 19:33 2357418

Цитата:

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

Elven 30-05-2014 12:33 2357706

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

Iska 30-05-2014 15:38 2357790

Ну, так используйте в таком случае «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 2357792

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


Iska 30-05-2014 16:31 2357822

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 2357834

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

Iska 30-05-2014 17:51 2357870

Цитата:

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



firstarey 02-06-2014 13:04 2358860

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

yurkind15 29-03-2016 10:35 2620859

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

Код:

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 »

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

Foreigner 29-03-2016 15:31 2620944

Цитата:

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

Значит все файлы подходят под критерий поиска. Что показывает @fdate?
Код:

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

yurkind15 29-03-2016 15:45 2620948

просмотрел, я то думал будет выводить файлы за последние 17 дней, а тут наоборот))

yurkind15 29-03-2016 16:01 2620954

А как тогда переделать этот код, чтобы выводился полный путь к файлам? Заменяю @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 2620977

Цитата:

Цитата yurkind15
а тут наоборот)) »

Тогда надо либо рассчитывать дату, а это все через задницу, либо исходить от обратного:
Код:

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

Foreigner, Спасибо!!!

инспектор 08-05-2020 08:44 2920293

cmd+Powershell
https://issue.life/questions/57429733


Время: 18:00.

Время: 18:00.
© OSzone.net 2001-