35

PowerShell を使用してdu -ish 分析を取得するにはどうすればよいですか? ディスク上のディレクトリのサイズを定期的に確認したいと考えています。

以下は、現在のディレクトリ内の各ファイルのサイズを示しています。

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

しかし、私が本当に欲しいのは、サブディレクトリを含む、ディレクトリ内のすべてのファイルの合計サイズです。また、必要に応じて、サイズでソートできるようにしたいと思います。

4

6 に答える 6

40

「Exploring Beautiful Languages」ブログで利用可能な実装があります。

「Powershell での 'du -s *' の実装」

function directory-summary($dir=".") { 
  get-childitem $dir | 
    % { $f = $_ ; 
        get-childitem -r $_.FullName | 
           measure-object -property length -sum | 
             select @{Name="Name";Expression={$f}},Sum}
}

(ブログ所有者によるコード: Luis Diego Fallas)

出力:

PS C:\Python25> ディレクトリの概要

名前 合計
---- ---
DLL 4794012
文書 4160038
382592 を含める
Lib 13752327
ライブラリ 948600
tcl 3248808
ツール 547784
LICENSE.txt 13817
NEWS.txt 88573
python.exe 24064
pythonw.exe 24576
README.txt 56691
w9xpopen.exe 4608
于 2009-05-15T12:06:17.100 に答える
28

回答のコマンドを少し変更して、サイズで降順に並べ替え、サイズを 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

最も効率的な方法ではないかもしれませんが、うまくいきます。

于 2012-10-10T16:23:53.427 に答える
4
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 }
    }
}

私のは少し違います。ディレクトリ名ですべてのファイルをグループ化し、そのリストを見て、各ディレクトリの合計を作成します (サブディレクトリを含めるため)。

于 2016-02-12T15:19:13.143 に答える