2015/06/09

PowerShell 複数あるフォルダー サイズを一度に計算する

Hyper-V用SSDの空き容量が徐々に少なくなってきましたので、PowerShell を使って仮想マシン(VM)毎のフォルダー サイズを確認するスクリプトを書いてみました。
フォルダー サイズを汎用的に計算できるよう、Hyper-V コマンドレットは使っていません。

2015.06.10 修正
Measure-Objectを使ってフォルダー サイズを求めるスクリプトにファイルだけを抽出する機能を追加しました。

サンプル

フォルダー サイズの計算は2種類書いています。
  • 単純にファイル サイズを足していく方法
  • Measure-Object コマンドレットを使う方法
単純にファイル サイズを足す方法はサンプルとしては良いのかもしれませんが、非効率な気がしたのでコメントアウトしています。
#集計結果を出力する関数
function Out-FolderSize
{
    param(
        [string]$vmName
        , [double]$folderSize
    )

    $obj = New-Object PSObject
    $obj | Add-Member NoteProperty VMName($vmName)
    $obj | Add-Member NoteProperty FolderSize("{0:0.##}GB" -f $folderSize)

    Write-Output $obj
}  

#フォルダー サイズ計算
$path = "D:\Hyper-V"
gci -Path $path | foreach `
{
    $size = 0
    #ファイル サイズを一つずつ足して計算
    <#
    gci -Path "$path\$_" -Recurse | foreach `
    {
        $size += $_.Length
    }
    Out-FolderSize -vmName $_ -folderSize ($size/1GB)
    #>

    #型がFileInfoのみを抽出し、Measure-Object コマンドレットの-sum パラメーターを使ってサイズを計算
    $size = gci -Path "$path\$_" -Recurse | ?{$_.GetType().Name -eq "FileInfo"} | Measure-Object -Property Length -Sum
    
    #結果を出力
    Out-FolderSize -vmName $_ -folderSize ($size.Sum/1GB)
}
尚、Out-FolderSize関数は下記のように書くこともできます。
function Out-FolderSize
{
    param(
        [string]$vmName
        , [double]$folderSize
    )

    $obj = New-Object PsObject | Select-Object "VMName", "FolderSize"
    $obj.VMName = $vmName
    $obj.FolderSize= "{0:0.##}GB" -f $folderSize

    Write-Output $obj
}
余談:gciって何?
PowerShell スクリプトに不慣れな時によく思った事は
  • gci
  • sl
  • %
  • ?
の文字が何を示しているのか?
また、
  • foreachとForeach-Object
  • selectとSelect-Object
などの違いが全く判りませんでした。
これらはAlias(代替え名)と言い、入力を短縮する事でスクリプトの入力作業を効率化できます。
Aliasを確認したい場合は、
Get-Alias コマンドレット
を実行してみましょう。
スポンサーリンク

スポンサーリンク