Powershell文件夹大小sorting与自动大小转换

我有一个PowerShell脚本获取文件夹名称,LastWriteTime,大小

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 } 

导致path/名称,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 

我想修改结果添加以下function

  • 以KB / Mb / GB自动显示大小
  • 按大小sorting结果(上面最常用的文件夹大小)

要添加自动转换function,我在一些论坛上发现了以下内容

 # 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天,如何将它与现有的脚本合并,并得到我想要的结果…任何帮助将非常感激…

你可以把逻辑放在前。 一个可重用的函数,并用它来生成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"