2010年6月26日土曜日

◆Get-ChildItemにフォルダーのLength表示を追加する

Dirコマンドでは、ファイルのLengthは表示されるが、フォルダーのLengthは表示されない。
20100626012819

そこで、PowerShell: ◆関数を作るで作った関数を修正し、フォルダーのLengthも表示するDirコマンド(関数)を作ってみた。

function dir3(
    [string]$Path = ".\",
    [switch]${??}){

$comment = @'
#####################################################

dirコマンドにフォルダーのサイズを追加して表示する

param(
    [string]$Path = ".\",
    [switch]${??}
)

例:
    #
    dir3  "C:\Windows"

#####################################################
'@

    Set-PSDebug -Strict

    if(${??}) {$comment;return}

    Get-ChildItem -Path $Path |
        select mode,LastWriteTime,@{
             name="length";expression={
                 if($_.PsIsContainer){
                    ($_ | Get-ChildItem -Recurse -ea silentlycontinue |
                     measure -Sum length).Sum
                  }else{
                    $_.length
                  }
             }
         },name |
        sort @{expression="mode";descending=$true},
             @{expression="name";descending=$false}
    Set-PSDebug -Off
}

あまり変わったところはないが、PsIsContainerプロパティでフォルダーかどうか判定しフォルダーに対してのみlengthを追加している。
(ファイルの場合はそのままlengthを返している)

Sortコマンドでは、昇順と降順の組み合わせを連想配列形式で指定している。

結果はこんな感じ。
20100626015546 
Selectすると表示書式が若干変わってしまう(クラスが変わるので仕方がない)。
また、Cドライブ直下などでやると若干時間がかかる。(だから標準ではlength表示しないのだろう)

結果でちょっと気になるのがPerfLogsフォルダ。
lengthが表示されていない。
中身を見てみるとファイルが存在していないためNullとなっている。
こんな時はif(SumがNullだったら)とかやりたくなるが以下のようにすると簡単に0表示できる。

                     measure -Sum length).Sum  +  0


ん~、Null + 0 は 0 なんですね。
Powershellっておもしろい。

0 件のコメント:

コメントを投稿