6

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

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

9

Powershell:

gci C:\Reports\*\* | where {$_.LastWriteTime -gt ((get-date)- (new-timespan -day 7))} | select FullName,LastWriteTime | ft

Разбив немного:

gci (aka get-childitem) делает то, на что это похоже, обрабатывает путь к предоставленной файловой системе как объект и извлекает из него дочерние элементы (файлы или папки).

Это передается оператору where , который имеет единственную функцию фильтра в качестве аргумента.

Функция фильтра представляет собой "простое" сравнение, в данном случае {A -gt B} = «Истина, если A больше, чем B». Первая часть этого - $_.LastWriteTime который берет каждый объект, переданный из канала, и извлекает свойство LastWriteTime. Последняя часть этого - относительная конструкция даты; нет ничего супер простого в PS. Первая часть даты получает текущую дату, затем вычитает количество времени из этого числа (в этом примере я создаю новый объект даты, который содержит значение 7 дней; так что теперь минус 7 дней даст дату 7 дней назад).

Из тех объектов, которые прошли через фильтрацию where я извлекаю только свойства FullName и LastWriteTime, так как это все, что нас волнует.

В конце концов, он передается команде format-table (aka 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 выше команду, например так: 4.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .