2011年11月17日木曜日

◆プロパティのToStringメソッドをオーバーライドする

ちょっと面白いスクリプトがあったので紹介。
Changing Units - Power Tips - Powershell.com Powershell Scripts, Tips and Resources

コードは以下のとおり。

001
002
003
004
005
006
007
008
009
010
011

dir $env:windir | 
Select-Object Mode, LastWriteTime, Length, Name | 
ForEach-Object
 { 
 
if ($_.Length -ne $null
) { 
   
$_.Length = $_.Length |
 
     
Add-Member ScriptMethod ToString
 { 
          (
'{0:0.0} KB' -f ($this/1KB
)) 
      } 
-Force -pass
 
  }
 
$_
} | Sort-Object Length

ファイルのレングスをKB単位で編集したいんだけど、そこで文字列に編集しちゃうとその後ソートが上手くいかない。
なのでLengthはそのままに、LengthのToStringメソッドをオーバーライドしちゃいましょうって感じ。
ToStringのオーバーライドはC#とかであれば良くやることだと思うがPowershellでは、あまりそういう発想がなかった。

また、this自動変数なんかも、こんな時につかうのかぁって感じ。

ただ、素直にやるなら集計プロパティを使えば良いだけのような気もする。(その後にまた処理が続くのであれば上記が有効の局面もあるのでしょう)

001
002
003
004
005
006
007
008
009
010

dir $env:windir | 
Select-Object Mode, LastWriteTime, Length, Name |
sort-Object Length |
  select Mode, LastWriteTime,
 
    @{
      name
="Length"
      expression=
{
       
if($_.length){'{0:0.0} KB' -f ($_.length/1KB
)}
      }
    }
, Name

0 件のコメント:

コメントを投稿