使用cmdlet get-member创建文件属性列表

时间:2012-03-10 20:34:45

标签: powershell

1)如何使用cmdlet 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 个答案:

答案 0 :(得分:5)

  1. 您无需使用Get-Member来执行此操作。您可以使用Sort-ObjectSelect-Object

    dir C:\ -Force | ? {!$_.PsIsContainer} | Sort LastWriteTime | Select FullName, Attributes
    
  2. 您可以使用Group-ObjectMeasure-Object来执行此操作。

    ((dir D:\Software -Force -Filter *.html | Group Extension).Group | Measure-Object -Sum Length).Sum / 1MB
    
  3. 我不确定您为什么不想使用Sort-Object -Property LastWriteTime,但以下是修复冒泡排序代码的方法。请记住,Get-Member不是用于访问属性值的正确cmdlet。

    $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
    }
    

答案 1 :(得分:2)

您不需要Get-Member来显示文件的属性。只需使用Get-ChildItem获取目录的内容,然后将其传递给Sort-Object

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

您可以将-Recurse参数添加到Get-ChildItem以列出子目录,并将-Force添加到具有Hidden属性的列表文件中。如果要显示除文件和目录的标准格式显示的属性之外的属性,则可以将所有这些管道传输到Format-* cmdlet:

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属性对文件进行分组,将每个组投影到具有扩展属性的对象中,并将属性用于总文件大小,然后按扩展名对结果进行排序。