создать список атрибутов файлов с помощью командлета get-member - PullRequest
0 голосов
/ 11 марта 2012

1) Как создать список атрибутов файлов с помощью командлета get-member и затем отсортировать его по времени последней записи?

2) Найти общий размер файлов с другим расширением (например, общий размер длявсе * .html файлы)

Я думаю, что решение для первой задачи (вторая задача в порядке) должно быть таким (однако это не работает)

 $a=get-childitem . -filter *.html
 $n=$a.Length
 do{
 $isnotsorted=0
 for($i=0;$i -lt ($n-1); $i++) {
  if ((get-member $a[$i]).LastWriteTime -lt (get-member $a[$i]).LastWRiteTime){
      $a[$i],$a[$i+1]=`
      $a[$i+1],$a[$i]
      $isnotsorted=$i+1
  }
 }
 $n=$isnotsorted
 }
 until ($n -eq 0)
 $a

Ответы [ 2 ]

5 голосов
/ 11 марта 2012
  1. Вам не нужно использовать Get-Member для этого. Вы можете использовать Sort-Object и Select-Object:

    dir C:\ -Force | ? {!$_.PsIsContainer} | Sort LastWriteTime | Select FullName, Attributes
    
  2. Вы можете использовать Group-Object и Measure-Object для этого.

    ((dir D:\Software -Force -Filter *.html | Group Extension).Group | Measure-Object -Sum Length).Sum / 1MB
    

Я не уверен, почему вы не хотите использовать Sort-Object -Property LastWriteTime, но вот как вы должны исправить свой код сортировки пузырьков. Помните, Get-Member не тот командлет, который используется для доступа к значению свойств.

$a = get-childitem -filter *.html
$n = $a.Length

do {
    $isnotsorted = 0
    for($i = 0; $i -lt ($n-1); $i++) {
        if ( ($a[$i]).LastWriteTime -lt ($a[$i + 1]).LastWRiteTime ) {
            $a[$i] , $a[$i+1] = $a[$i+1] , $a[$i]
            $isnotsorted = $i + 1
        }
    }   
    $n = $isnotsorted
} until ($n -eq 0)
$a

Еще одна вещь, на которую следует обратить внимание, это то, что производительность этого алгоритма намного хуже, чем просто использование Sort-Object. Моя папка с музыкой содержит 1355 файлов, и все вышеперечисленное заканчивается за 83 секунды. Использование Sort-Object завершается за 1,7 секунды.

Measure-Command {
    get-childitem D:\shares\Music -rec -filter *.m4a | Sort-Object LastWriteTime
}
2 голосов
/ 11 марта 2012

Вам не нужно Get-Member для отображения атрибутов файлов. Просто используйте Get-ChildItem, чтобы получить содержимое каталога, а затем перенаправьте его на Sort-Object:

Get-ChildItem -Path $path | Sort-Object -Property 'LastWriteTime'

Вы можете добавить параметр -Recurse в Get-ChildItem, чтобы вывести список дочерних каталогов, и добавить -Force, чтобы вывести список файлов с атрибутом Hidden. Вы можете передать все это командлету Format-*, если хотите отобразить свойства, отличные от тех, которые отображаются при стандартном форматировании файлов и каталогов:

Get-ChildItem -Path $path `
    | Sort-Object -Property 'LastWriteTime' `
    | Format-Table -Property @('Attributes', 'FullName', 'CreationTime')

Get-Member может использоваться для определения того, какие свойства существуют в объекте файла или каталога.

Вы можете использовать Measure-Object с переключателем -Sum, чтобы добавить свойство Length коллекции файлов:

$htmlFiles = Get-ChildItem -Path $path -Filter '*.html';
$measurement = $htmlFiles | Measure-Object -Property 'Length' -Sum;
$totalHtmlSize = $measurement.Sum;

Чтобы сгенерировать таблицу общего размера для каждого типа файла, вы можете сделать что-то вроде этого:

Get-ChildItem -Path $path `
    | Where-Object { $_ -is [IO.FileInfo]; } `
    | Group-Object -Property 'Extension' `
    | Select-Object `
        @{ Name = 'Extension'; Expression = 'Name' }, `
        @{ Name = 'TotalSize'; Expression = { `
            ($_.Group | Measure-Object -Property 'Length' -Sum).Sum } `
        } `
    | Sort-Object -Property 'Extension';

, который извлекает содержимое $path, фильтрует его для включения только файлов, группирует файлы по свойству Extension, проецирует каждую группу в объект со свойством для расширения и свойством для общего размера файла, затем сортирует результаты по расширению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...