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

3728
Iszi

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

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

6

1 ответ на вопрос

9
Chris S

Powershell:

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

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

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

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

Функция фильтра представляет собой «простое» сравнение, в данном случае = «Истина, если 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(Необходимо снять часть «| ft», или она добавит 4 строки форматирования таблицы, которые будут подсчитаны и сбросят ваш счет на 4.

Вот это да. У меня есть * много * обучения PowerShell. Хотя большая часть этого кажется довольно логичной, вы не возражаете против этого немного больше? Также было бы здорово иметь копию вывода. Iszi 12 лет назад 1
Хорошо, я выполнил команду на своей цели, и вывод слишком многословен, чтобы сразу же быть полезным. Есть ли способ немного сократить это, чтобы на каждый найденный предмет была только одна строка? Также (или в качестве альтернативы) я могу заставить PowerShell просто дать мне итоги поиска? Iszi 12 лет назад 0
@Iszi, изменил его немного, чтобы быть красивее, и вариант только для подсчета. Chris S 12 лет назад 0
Ack! Я пропускаю еще один шаг (добавлю к OP тоже) - нужно извлекать каталоги * только *. Еще раз спасибо за большую помощь! Iszi 12 лет назад 0
Я понял, что мне нужно добавить `Where {$ _. PsIsContainer -eq $ true}` к командной строке где-нибудь. Вопрос теперь заключается в том, нужно ли просто добавить его в конвейер или есть способ, которым я должен включить новое условие в существующее выражение `где`? Iszi 12 лет назад 0
Вы можете добавить его к текущему оператору where, чтобы часть where конвейера стала такой: `where {($ _. LastWriteTime -gt ((get-date) - (new-timespan -day 7))) -and ($ _.psIsContainer -eq $ True)} ` Matrix Mole 12 лет назад 1
@MatrixMole - Спасибо. Синтаксис PowerShell - это то, к чему я должен привыкнуть. Iszi 12 лет назад 0
Добавление примечания от @ChrisS в чат: * "Замените функции where на июнь текущего года {$ _LastWriteTime.Year -eq Get-Date.Year -and $ _LastWriteTime.Month -eq 6}." * Iszi 12 лет назад 0

Похожие вопросы