2012-03-10 85 views
0

1)如何使用cmdlet get-member創建文件的屬性列表,然後按上次寫入時間對其進行排序?使用cmdlet創建文件屬性列表get-member

2)查找所有* .html文件不同的擴展名(examp總規模文件的總大小)

我認爲第一個任務的解決方案(第二項任務是確定)應該是這樣的(但是它不工作)

$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 
+0

正如@BACON所說,'Get-Member'會給你對象的屬性和方法。你是否將這些稱爲屬性?通常屬性被認爲是文件的屬性(隱藏,只讀,存檔等)。這些可以通過'Get-Member'不創建的'System.IO.FileInfo'對象的實例來訪問。 – 2012-03-10 21:26:21

+0

也許它的名字'Get-Member'令人困惑? 'Get-Member'不會「獲取」對象成員(方法,參數或字段)的值。 'Get-Member'從對象的類型中獲取成員的定義。要檢索特定成員的值,可以使用'$ foo.Property'語法,或者使用諸如'Select-Object'或'Format- *'的cmdlet。請注意,在文件列表中,假設您沒有動態附加自定義屬性,即使每個文件的成員值不同,「Get-Member」也會爲每個文件返回相同的成員定義。 – BACON 2012-03-10 21:38:03

+2

所以這是一個學習練習來實現自己的冒泡排序,對吧?你不想只把你的代碼片段改成'get-childitem。 -filter * .html | Sort-Object -Property'LastWriteTime'?因爲那*會*通過它們的'LastWriteTime'屬性對'.html'文件列表進行排序。我認爲問題在於你需要將'(get-member $ a [$ i])。LastWriteTime'改爲'$ a [$ i] .LastWriteTime',並且你還將每個文件與自己進行比較(你在那裏需要'$ a [$ i + 1]')。正如我上面所解釋的那樣,'Get-Member'不像這樣工作,在這裏不需要。只需直接訪問該屬性。 – BACON 2012-03-10 22:44:47

回答

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 
    

我不知道爲什麼你不希望使用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 
} 
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屬性包括文件,組文件,每個組伸入一個對象與prope rty用於擴展,用於總文件大小的屬性,然後通過擴展對結果進行排序。

+0

但是,任務是使用Get-Member。 – 2012-03-10 21:17:46

+0

我不太明白你在找什麼。 'Get-Member'將檢索在特定類型上定義的屬性和方法。要獲取某個類型的* instance *上的屬性值,您需要實際使用類似於「Get-ChildItem」的方法來檢索這些實例。因此,您需要文件本身的屬性,或者您想使用'Get-Member'來檢索['FileInfo'類]上定義的屬性(http://msdn.microsoft.com/library/system.io .fileinfo.aspx)? – BACON 2012-03-10 21:21:05

+0

我認爲在這個任務中,我需要用'Get-Member'創建屬性列表(可能是屬性),找到屬性(property)'lastwritetime',然後通過這個屬性對所有文件進行排序(但是我需要從這個屬性中獲得屬性列表)。 – 2012-03-10 21:39:31