Фильтровать файлы по временному интервалу в одну таблицу

#powershell

#powershell

Вопрос:

Я пытаюсь вернуть все файлы во вложенных папках папки, у которых есть время последней записи в течение определенного промежутка времени. Я бы хотел, чтобы эти файлы были только в одной таблице. Я хочу видеть имя файла, размер файла и LastWriteTime.

У меня пока есть этот код:

 $timestartstr = "2020-09-16 07:00:00"
$timestart = [datetime]::ParseExact($timestartstr, "yyyy-MM-dd HH:mm:ss", $null)
$timeendstr = "2020-09-16 09:00:00"
$timeend = [datetime]::ParseExact($timeendstr, "yyyy-MM-dd HH:mm:ss", $null)

$dir = "pathtoparentfolder"

Get-ChildItem -Recurse $dir 
    Where-Object {$_.LastWriteTime -gt $timestart -and $_.LastWriteTime -lt $timeend} 
    Format-Table LastWriteTime, Name
  

Это не фильтрация по указанному мной временному интервалу, gt / lt, похоже, ничего не делает, а также возвращает отдельную таблицу для каждого подкаталога.

Я относительно новичок в PS и не могу понять, как достичь того, чего я хочу.

Обновить
Смотрите комментарии под принятым ответом о том, как исключить имена папок из результатов

Окончательный рабочий сценарий:

 $timestartstr = "2020-09-16 07:00:00"
$timestart = [datetime]::ParseExact($timestartstr, "yyyy-MM-dd HH:mm:ss", $null)
$timeendstr = "2020-09-16 09:00:00"
$timeend = [datetime]::ParseExact($timeendstr, "yyyy-MM-dd HH:mm:ss", $null)

$dir = "pathtoparentfolder"

Get-ChildItem -Recurse -File $dir |
    Where-Object {$_.LastWriteTime -gt $timestart -and $_.LastWriteTime -lt $timeend} |
        Select-Object Name,LastWriteTime,Length
  

Редактировать
Указанное Length свойство указано в байтах, не очень читаемо, ниже приведено обновление для этой строки, чтобы вернуть размер в МБ как Double .

 Select-Object Name,LastWriteTime,@{N='SizeMB';E={[double]('{0:N2}' -f ($_.Length/1kb))}}
  

Комментарии:

1. у вас нет никаких | символов в конце строк «предполагается, что это конвейер». [ усмешка ]

2. кроме того, здесь, в часовом поясе CST, он по-прежнему 15-й, а не 16-й. [ усмешка ]

3. Ха-ха, да, у меня изначально были | символы, но я удалил их, пытаясь добиться желаемого поведения 🙂 Я в Новой Зеландии, отсюда и дата 😉

4. ах! [ усмешка ] с этими элементами, с которыми я имею дело, ваш код работает для меня, чтобы получить элементы в желаемом диапазоне времени.

Ответ №1:

Как указал мистер Ли_дэйли, вам не хватает связующего звена между вашими командами — символа канала | . Вам также не хватает свойства length, и я рекомендую использовать Select-Object over Format-Table , чтобы сохранить элементы как надлежащие объекты.

 Get-ChildItem -Recurse $dir |
    Where-Object {$_.LastWriteTime -gt $timestart -and $_.LastWriteTime -lt $timeend} |
        Select-Object Name,LastWriteTime,Length
  

Редактировать:

Чтобы исключить каталоги, вы можете просто применить -File параметр к Get-ChildItem

 Get-ChildItem -File -Recurse $dir |
    Where-Object {$_.LastWriteTime -gt $timestart -and $_.LastWriteTime -lt $timeend} |
        Select-Object Name,LastWriteTime,Length
  

Комментарии:

1. Приветствия, одна вещь, которую я забыл указать в вопросе, заключается в том, как исключить это из возвращаемых имен папок?