Список подпапок на определенном уровне, с измененными датами
Задача для вас, ребята, здесь:
Мне нужен какой-то метод (желательно встроенный, но сторонние приложения F/OSS также могут быть рассмотрены) для генерации списка подпапок на определенном уровне вместе с (или, что лучше, отфильтрованными) их "измененными" Дата". Обратите внимание, что мне нужен только список папок - из выходных данных должны быть исключены файлы.
Пример:
Для структуры папок:
C:
\---Reports
+----Task1
| \----Report1
| +----CSV
| +----HTML
| \----XML
+----Task2
| +----Report1
| | +----CSV
| | +----HTML
| | \----XML
| +----Report2
| | +----CSV
| | +----HTML
| | \----XML
| \----Report3
| +----CSV
| +----HTML
| \----XML
\----Task3
+----Report1
| +----CSV
| +----HTML
| \----XML
\----Report2
+----CSV
+----HTML
\----XML
Я хочу, чтобы в списке была информация, похожая на:
PATH | MODIFIED
=============================|==========
C:\Reports\Task1\Report1 | 6/23/2011
C:\Reports\Task2\Report1 | 6/17/2011
C:\Reports\Task2\Report2 | 6/30/2011
C:\Reports\Task2\Report3 | 7/06/2011
C:\Reports\Task3\Report1 | 6/22/2011
C:\Reports\Task3\Report2 | 7/13/2011
(Обратите внимание на исключение папок выше или ниже уровня папок "Report#".)
Или, в идеале, я хотел бы что-то, что может генерировать отчет как это:
PATH | MODIFIED
=============================|==========
C:\Reports\Task1\Report1 | 6/23/2011
C:\Reports\Task2\Report1 | 6/17/2011
C:\Reports\Task2\Report2 | 6/30/2011
C:\Reports\Task3\Report1 | 6/22/2011
=============================|==========
TOTAL | 4
(Обратите внимание, что это представляет собой отфильтрованную версию предыдущего списка, ограниченную определенным диапазоном дат.)
Это будет сделано в Windows XP/2003. PowerShell доступен. Опять же, я бы предпочел использовать доступные встроенные утилиты, но инструменты F/OSS также могут быть рассмотрены.
1 ответ
Powershell:
gci C:\Reports\*\* | where {$_.LastWriteTime -gt ((get-date)- (new-timespan -day 7))} | select FullName,LastWriteTime | ft
Разбив немного:
gci
(ака get-childitem
) выполняет то, на что это похоже, обрабатывает указанный путь к файловой системе как объект и извлекает из него дочерние элементы (файлы или папки).
Это попадает в where
оператор, который имеет одну функцию фильтра в качестве аргумента.
Функция фильтра представляет собой "простое" сравнение, в данном случае {A -gt B} = "Истина, если A больше, чем B". Первая часть этого $_.LastWriteTime
который берет каждый объект, переданный из канала, и извлекает свойство LastWriteTime. Последняя часть этого - относительная конструкция даты; нет ничего супер простого в PS. Первая часть даты получает текущую дату, затем вычитает количество времени из этого числа (в этом примере я создаю новый объект даты, который содержит значение 7 дней; так что теперь минус 7 дней даст дату 7 дней назад).
Из тех предметов, которые сделали это через where
фильтрация Я вытаскиваю только свойства FullName и LastWriteTime, так как это все, что нас волнует.
В конце концов, это по трубопроводу format-table
(ака ft
), поэтому она создает красивую таблицу примерно так:
FullName LastWriteTime
-------- -------------
C:\Reports\Task1\Report1 7/11/2011 10:00:00 AM
C:\Reports\Task2\Report1 7/10/2011 5:00:00 AM
C:\Reports\Task2\Report2 7/6/2011 9:00:00 PM
C:\Reports\Task4\Report7 7/4/2011 3:00:00 PM
Чтобы получить только счет всего этого, заключите указанную выше команду следующим образом: (mess_from_above_less_the_ft_part).count
(Нужно снять часть "| ft" или добавить 4 строки форматирования таблицы, которые будут подсчитаны и отбросят ваш счет на 4.