ду в PowerShell? - PullRequest
       19

ду в PowerShell?

23 голосов
/ 15 мая 2009

Как получить анализ du -ish, используя PowerShell? Я хотел бы периодически проверять размер каталогов на моем диске.

Ниже приведен размер каждого файла в текущем каталоге:

foreach ($o in gci)
{
   Write-output $o.Length
}

Но что мне действительно нужно, так это совокупный размер всех файлов в каталоге, включая подкаталоги. Также я хотел бы иметь возможность сортировать его по размеру, по желанию.

Ответы [ 3 ]

28 голосов
/ 15 мая 2009

В блоге "Изучение прекрасных языков" есть реализация:

"Реализация du -s * в 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
20 голосов
/ 10 октября 2012

Я слегка изменил команду в ответе, чтобы отсортировать по убыванию и включить размер в МБ:

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

Возможно, это не самый эффективный метод, но он работает.

1 голос
/ 12 февраля 2016
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 }
    }
}

Мой немного отличается; Я группирую все файлы по имени каталога, а затем просматриваю итоги построения списка для каждого каталога (включая подкаталоги).

...