如何使用PowerShell获得du-ish分析?我想定期检查磁盘上目录的大小。下面给出了当前目录中每个文件的大小:
foreach ($o in gci) { Write-output $o.Length }
但我真正想要的是目录中所有文件的总大小,包括子目录。我也希望能够按大小排序,可选。
jpfvwuh41#
在“探索美丽的语言”博客上有一个实现:"An implementation of 'du -s *' in Powershell"
function directory-summary($dir=".") { get-childitem $dir | % { $f = $_ ; get-childitem -r $_.FullName | measure-object -property length -sum | select @{Name="Name";Expression={$f}},Sum} }
输出:
PS C:\Python25> directory-summary Name Sum ---- --- DLLs 4794012 Doc 4160038 include 382592 Lib 13752327 libs 948600 tcl 3248808 Tools 547784 LICENSE.txt 13817 NEWS.txt 88573 python.exe 24064 pythonw.exe 24576 README.txt 56691 w9xpopen.exe 4608
jv4diomz2#
我稍微修改了答案中的命令,以按大小降序排序,并包括MB大小:
gci . | %{$f=$_; gci -r $_.FullName | measure-object -property length -sum | select @{Name="Name"; Expression={$f}}, @{Name="Sum (MB)"; Expression={"{0:N3}" -f ($_.sum / 1MB) }}, Sum } | sort Sum -desc | format-table -Property Name,"Sum (MB)", Sum -autosize
PS C:\scripts> du Name Sum (MB) Sum ---- -------- --- results 101.297 106217913 SysinternalsSuite 56.081 58805079 ALUC 25.473 26710018 dir 11.812 12385690 dir2 3.168 3322298
也许这不是最有效的方法,但它确实有效。
yzxexxkh3#
如果只需要该路径的总大小,一个简化版本可以是,
Get-ChildItem -Recurse ${HERE_YOUR_PATH} | Measure-Object -Sum Length
svmlkihl4#
function Get-DiskUsage ([string]$path=".") { $groupedList = Get-ChildItem -Recurse -File $path | Group-Object directoryName | select name,@{name='length'; expression={($_.group | Measure-Object -sum length).sum } } foreach ($dn in $groupedList) { New-Object psobject -Property @{ directoryName=$dn.name; length=($groupedList | where { $_.name -like "$($dn.name)*" } | Measure-Object -Sum length).sum } } }
我的有点不同;我将directoryname上的所有文件分组,然后遍历该列表,为每个目录(包括子目录)构建总计。
643ylb085#
基于前面的答案,这将适用于那些希望以KB,MB,GB等显示大小的人,并且仍然能够按大小排序。要更改单位,只需将“名称=”和“表达式=”中的“MB”更改为所需的单位。您还可以通过更改“2”来更改要显示的小数位数(舍入)。
function du($path=".") { Get-ChildItem $path | ForEach-Object { $file = $_ Get-ChildItem -File -Recurse $_.FullName | Measure-Object -Property length -Sum | Select-Object -Property @{Name="Name";Expression={$file}}, @{Name="Size(MB)";Expression={[math]::round(($_.Sum / 1MB),2)}} # round 2 decimal places } }
这给出了一个数字而不是一个字符串的大小(如另一个答案所示),因此可以按大小排序。例如:
PS C:\Users\merce> du | Sort-Object -Property "Size(MB)" -Descending Name Size(MB) ---- -------- OneDrive 30944.04 Downloads 401.7 Desktop 335.07 .vscode 301.02 Intel 6.62 Pictures 6.36 Music 0.06 Favorites 0.02 .ssh 0.01 Searches 0 Links 0
hc2pp10m6#
我自己使用以前的答案:
function Format-FileSize([int64] $size) { if ($size -lt 1024) { return $size } if ($size -lt 1Mb) { return "{0:0.0} Kb" -f ($size/1Kb) } if ($size -lt 1Gb) { return "{0:0.0} Mb" -f ($size/1Mb) } return "{0:0.0} Gb" -f ($size/1Gb) } function du { param( [System.String] $Path=".", [switch] $SortBySize, [switch] $Summary ) $path = (get-item ".").FullName $groupedList = Get-ChildItem -Recurse -File $Path | Group-Object directoryName | select name,@{name='length'; expression={($_.group | Measure-Object -sum length).sum } } $results = ($groupedList | % { $dn = $_ if ($summary -and ($path -ne $dn.name)) { return } $size = ($groupedList | where { $_.name -like "$($dn.name)*" } | Measure-Object -Sum length).sum New-Object psobject -Property @{ Directory=$dn.name; Size=Format-FileSize($size); Bytes=$size` } }) if ($SortBySize) { $results = $results | sort-object -property Bytes } $results | more }
ef1yzkbh7#
使用Get-Chiltree,并不是那么慢:
(Get-ChildItem -Path $path -Recurse | Measure-Object -Property Length -Sum).Sum / 1GB
7条答案
按热度按时间jpfvwuh41#
在“探索美丽的语言”博客上有一个实现:
"An implementation of 'du -s *' in Powershell"
输出:
jv4diomz2#
我稍微修改了答案中的命令,以按大小降序排序,并包括MB大小:
输出:
也许这不是最有效的方法,但它确实有效。
yzxexxkh3#
如果只需要该路径的总大小,一个简化版本可以是,
svmlkihl4#
我的有点不同;我将directoryname上的所有文件分组,然后遍历该列表,为每个目录(包括子目录)构建总计。
643ylb085#
基于前面的答案,这将适用于那些希望以KB,MB,GB等显示大小的人,并且仍然能够按大小排序。要更改单位,只需将“名称=”和“表达式=”中的“MB”更改为所需的单位。您还可以通过更改“2”来更改要显示的小数位数(舍入)。
这给出了一个数字而不是一个字符串的大小(如另一个答案所示),因此可以按大小排序。例如:
hc2pp10m6#
我自己使用以前的答案:
ef1yzkbh7#
使用Get-Chiltree,并不是那么慢: