Подтвердить что ты не робот

Du в PowerShell?

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

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

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

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

4b9b3361

Ответ 1

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

"Реализация" 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

Ответ 2

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

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

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

Ответ 3

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 }
    }
}

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