PowerShellを用い、ディレクトリ単位でファイル容量を出力する方法を以下に記します。
本資料では、簡単なサンプルを公開しています。
以下のスクリプトは、現在いるカレントディレクトリ内にあるフォルダを対象とし、そのフォルダ内にあるファイル容量の合計値を取得します。
$o = @()
Get-ChildItem . | Where-Object PSisContainer | %{ $PATH=$_; Get-ChildItem -Force -Recurse $_ | Measure-Object -Sum Length } | %{ $o += ([PSCustomObject]@{ PATH=$PATH.FullName; SUM=$_.Sum })}
$o
上記のスクリプトを起動すると以下のように出力されます。
尚、カレントディレクトリ(.)上にある、ファイルは対象外となります。
以下の例では、C:\Windows\Microsoft.NET を対象にファイルサイズを取得しました。
PS C:\> cd C:\Windows\Microsoft.NET
PS C:\Windows\Microsoft.NET> $o = @()
PS C:\Windows\Microsoft.NET> Get-ChildItem . | Where-Object PSisContainer | %{ $PATH=$_; Get-ChildItem -Force -Recurse $_ | Measure-Object -Sum Length } | %{ $o += ([PSCustomObject]@{ PATH=$PATH.FullName; SUM=$_.Sum })}
PS C:\Windows\Microsoft.NET> $o
PATH SUM
---- ---
C:\Windows\Microsoft.NET\assembly 168640526
C:\Windows\Microsoft.NET\Framework 263581306
C:\Windows\Microsoft.NET\Framework64 551896484
ディレクトリ構造を確認します。
バグ発見です!
以下のスクリーンショットの通り、4つのフォルダがあるのに、authmanが表示されていません。
調べてみると、Get-ChildItemで指定したフォルダ内にファイルが1つもないとnullを返却しており、
後方の処理に渡らない事が判明しました。
if else を使うとパイプラインがうまく動作しなかったので、以下のように関数にしました。 以下のように関数として作成しました。
Function Get-DirTotalFileSize() {
if ($args.Length -ne 1) {
$Host.UI.WriteErrorLine("Usage: Get-DirectorySize <path>")
return
}
$pathto = $args[0]
if (!(Test-Path -PathType Container $pathto)) {
$Host.UI.WriteErrorLine("Cannot access $pathto : No such directory")
return
}
$o = @()
$dirs = Get-ChildItem $pathto | Where-Object PSisContainer
$dirs | % {
$PATH=$_;
if ((Get-ChildItem $_.FullName).Length -ne 0) {
$measure = Get-ChildItem -Force -Recurse $_.FullName | Measure-Object -Sum Length
$o += [PSCustomObject]@{ PATH=$PATH.FullName; SUM=$measure.Sum }
} else {
$o += [PSCustomObject]@{ PATH=$PATH.FullName; SUM=0 }
}
}
$o
}
上記のスクリプトをダウンロードするか、テキストエディタに貼り付け保存してください。
尚、拡張子はps1にしてください。
以下の例は、デスクトップに保存し使用した例です。
面倒であれば、上記スクリプトをPowerShellのコンソールに貼り付けてもOKです。
. PS C:\> . C:\Users\sakura\Desktop\func.ps1
PS C:\> Get-DirTotalFileSize Usage: Get-DirectorySize <path> PS C:\> Get-DirTotalFileSize hoge Cannot access hoge : No such directory PS C:\> Get-DirTotalFileSize C:\Windows\Microsoft.NET PATH SUM ---- --- C:\Windows\Microsoft.NET\assembly 168640526 C:\Windows\Microsoft.NET\authman 0 C:\Windows\Microsoft.NET\Framework 263581306 C:\Windows\Microsoft.NET\Framework64 551896484
上記の関数により、ファイルサイズ一覧が取得できたので、CSVにしてみます。
PS C:\> $d = Get-DirTotalFileSize C:\Windows\Microsoft.NET PS C:\> $d | Export-Csv -NoTypeInformation -Encoding Default list.csv PS C:\> notepad.exe .\list.csv
csv出力されているのが確認できます。
以上、PowerShellでディレクトリ内のファイル総合計容量を確認する方法でした。