2017-02-22 48 views
1

我有一個PowerShell腳本,拿到的文件夾名稱,LastWriteTime,大小PowerShell的文件夾大小排序與自動調整大小轉換

cd \myfolder  
get-childitem | where {$_.PSIsContainer} | foreach { 
    $size = (Get-ChildItem $_ -Recurse -Force | where {!$_.PSIsContainer} | Measure-Object -Sum Length).Sum 
    $obj = new-object psobject 
    add-member -inp $obj noteproperty path $_.Name 
    add-member -inp $obj noteproperty time $_.LastWriteTime 
    add-member -inp $obj noteproperty size $size 
    $obj 
    } 

在路徑/名稱,LastWriteTime所得,尺寸

path         time                  size 
----         ----                  ---- 
Audit_data_network_8-FEB-2017   2/8/2017 10:59:33 AM             1071084 
dec-2015        1/25/2016 10:05:07 AM             29742775 
games         2/15/2016 11:33:02 AM             52134862 
kolachi         12/2/2015 3:37:27 PM             12487862 
lighroom_        5/29/2015 2:13:10 PM             2788765 
Mini_Remote_Control7.5.9.0_Portable  6/13/2014 3:58:08 PM             52406834 
ps          2/20/2017 4:23:10 PM              126707 
totalcmd        1/25/2017 4:20:48 PM             11113908 

我想修改結果添加以下功能

  • 以KB/Mb/GB自動顯示大小
  • 排序與面積(上面最常用的文件夾的大小)結果

要添加自動轉換功能,我在一些論壇

# If ($size -lt 1KB) { $sizeOutput = "$("{0:N2}" -f $size) B" } 
#ElseIf ($size -lt 1MB) { $sizeOutput = "$("{0:N2}" -f ($size/1KB)) KB" } 
#ElseIf ($size -lt 1GB) { $sizeOutput = "$("{0:N2}" -f ($size/1MB)) MB" } 
#ElseIf ($size -lt 1TB) { $sizeOutput = "$("{0:N2}" -f ($size/1GB)) GB" } 
#ElseIf ($size -lt 1PB) { $sizeOutput = "$("{0:N2}" -f ($size/1TB)) TB" } 
#ElseIf ($size -ge 1PB) { $sizeOutput = "$("{0:N2}" -f ($size/1PB)) PB" } 
#Write-Output $sizeOutput 

發現以下,但我從過去的2-3天真的stucked由於我缺乏在這個腳本知情的了,如何與現有的腳本合併,並得到我想要的 結果... 任何幫助將非常感激......

回答

3

你可以把邏輯前。一個可重用的函數,並用它來生成size的屬性值。在這個解決方案中,我使用了計算屬性而不是函數。這樣我們可以保持排序的原始大小(長度總和),並在之後修改輸出。我也簡化了你的對象創建。例如:

獲取-FoldersWithSize.ps1:

param ($Path = ".") 

$PrettySizeColumn = @{name="Size";expression={ 
    $size = $_.Size 
    if ($size -lt 1KB) { $sizeOutput = "$("{0:N2}" -f $size) B" } 
    ElseIf ($size -lt 1MB) { $sizeOutput = "$("{0:N2}" -f ($size/1KB)) KB" } 
    ElseIf ($size -lt 1GB) { $sizeOutput = "$("{0:N2}" -f ($size/1MB)) MB" } 
    ElseIf ($size -lt 1TB) { $sizeOutput = "$("{0:N2}" -f ($size/1GB)) GB" } 
    ElseIf ($size -lt 1PB) { $sizeOutput = "$("{0:N2}" -f ($size/1TB)) TB" } 
    ElseIf ($size -ge 1PB) { $sizeOutput = "$("{0:N2}" -f ($size/1PB)) PB" } 
    $sizeOutput 
}} 

Get-ChildItem -Path $Path | Where-Object {$_.PSIsContainer} | ForEach-Object { 
    $size = (Get-ChildItem -Path $_.FullName -Recurse -Force | where {!$_.PSIsContainer} | Measure-Object -Sum Length).Sum 
    $obj = new-object -TypeName psobject -Property @{ 
     Path = $_.Name 
     Time = $_.LastWriteTime 
     Size = $size 
    } 
    $obj 
} | Sort-Object -Property Size -Descending | Select-Object Path, Time, $PrettySizeColumn 

用法:

#Current directory (default value) 
.\Get-FoldersWithSize.ps1 

#Relative path 
.\Get-FoldersWithSize.ps1 -Path ".\Downloads" 

#Absolute path 
.\Get-FoldersWithSize.ps1 -Path "C:\ProgramData" 
+0

該社區的祝福爲初學者和麻木,堅果和我一樣:) 這個工作100%完美。非常感謝你的時間人。 還有一件事。如果我想提供我選擇的文件夾(如我們在腳本中使用$ 1) /示例:script.ps1 c:\ temp(我選擇的文件夾,以便我不必在腳本中對其進行硬編碼) –

+1

刪除'cd \ myfolder「'部分併爲第一個'Get-ChildItem'調用指定一個路徑。我已經更新了答案以作爲帶參數的腳本工作(最後編輯...) –

+0

**得到了它**精美:)致敬! –