Список подпапок на определенном уровне, с измененными датами

Задача для вас, ребята, здесь:

Мне нужен какой-то метод (желательно встроенный, но сторонние приложения 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.

Другие вопросы по тегам