Format-Tableで右揃えとか三項演算子的なこと

chromeのプロセス一覧見てみよ~(ドヤ顔

f:id:izana1018:20150219001153p:plain

な・ん・だ・と!?

すっからかんだと!?
てか、なんだこの空行は!?

右にスクロールしてみる

f:id:izana1018:20150219001159p:plain

出てきた~!

画面のプロパティを見てみると・・・

f:id:izana1018:20150219001203p:plain

そうです。
画面バッファーのサイズを広げてました。

Format-Tableコマンドレット

まぁ右スクロールすれば出てくるからいいけど、見難い!

ということでFormat-Table(以下ft)-AutoSizeをカマしてみる

PS C:\Users> gps chrome | ft -a id,name

  Id Name
  -- ----
1304 chrome
1328 chrome
1744 chrome
1868 chrome
2776 chrome
3252 chrome
4392 chrome
5172 chrome
5224 chrome
5372 chrome
5648 chrome
6204 chrome
6284 chrome
6556 chrome
6844 chrome
6992 chrome
7096 chrome
7156 chrome
8304 chrome
9408 chrome
PS C:\Users>

いい感じに自動的に幅を調整してくれます。

右揃えや中央揃え

このft、色々と出来ちゃいます。

いろいろな表示サンプル

PS C:\Windows\system32> gps chrome |
  ft -a Id,
        Name,
        VirtualMemorySize64,
        # 仮想メモリをMB変換して小数点第二位で表示
        @{n="VM[MB]";
          e={"{0:N2}" -F ($_.VirtualMemorySize64/1MB)}},
        # 仮想メモリピーク値をMB変換して小数点第二位で右揃え
        @{n="PeakVM[MB]";
          e={"{0:N2}" -F ($_.PeakVirtualMemorySize64/1MB)};
          a="r"},
        # 仮想メモリが1GB以上の行にY、それ以外Nでセンタリング
        @{n="Over 1GB#if";
          e={if($_.VirtualMemorySize64 -ge 1GB){"Y"}else{"N"}};
          a="c"},
        @{n="Over 1GB#map";
          e={@{$true="Y";$false="N"}[$_.VirtualMemorySize64 -ge 1GB]};
          a="l"},
        @{n="Over 1GB#array";
          e={@("Y","N")[-not( $_.VirtualMemorySize64 -ge 1GB)]};
          a="r"}


   Id Name   VirtualMemorySize64 VM[MB]   PeakVM[MB] Over 1GB#if Over 1GB#map Over 1GB#array
   -- ----   ------------------- ------   ---------- ----------- ------------ --------------
 1124 chrome           865202176 825.12       829.12      N      N                         N
 1424 chrome          1181487104 1,126.75   1,143.75      Y      Y                         Y
 2116 chrome           957128704 912.79       916.79      N      N                         N
 4788 chrome           913203200 870.90       871.90      N      N                         N
 4912 chrome           950034432 906.02       916.02      N      N                         N
 8496 chrome           995819520 949.69       955.96      N      N                         N
 8588 chrome           311062528 296.65       307.28      N      N                         N
 8712 chrome          1492869120 1,423.71   1,466.71      Y      Y                         Y
 8756 chrome           897290240 855.72       858.72      N      N                         N
 8792 chrome           776208384 740.25       745.25      N      N                         N
 8800 chrome           801337344 764.21       771.22      N      N                         N
 8808 chrome           862097408 822.16       862.30      N      N                         N
 8820 chrome           774639616 738.75       743.75      N      N                         N
 8832 chrome           778833920 742.75       748.75      N      N                         N
 8840 chrome           770445312 734.75       741.75      N      N                         N
 8848 chrome           775159808 739.25       746.25      N      N                         N
 8856 chrome           770445312 734.75       741.75      N      N                         N
 8864 chrome           771493888 735.75       743.75      N      N                         N
 8872 chrome           769658880 734.00       739.00      N      N                         N
 8912 chrome           998236160 951.99       979.99      N      N                         N
 9660 chrome          1066119168 1,016.73   1,025.73      N      N                         N
 9664 chrome           914006016 871.66       876.66      N      N                         N
10192 chrome          1044418560 996.04     1,012.54      N      N                         N


三項演算子VBでいうIIF)的な何か

前述のサンプル。
実は三項演算子的なことしてます。

お気づき?

列「Over 1GB#map」と「Over 1GB#array」は条件が真と偽で表示内容を変えてます。

仕組みは単純。

@{$true="Y";$false="N"}[$_.VirtualMemorySize64 -ge 1GB]

$trueは"Y"、$falseは"N"という連想配列を作って、真偽値を使って連想配列から値をゲットしているだけ。

VBで書くならこんな感じでしょうか

Dim map As New Hashmap()
map.add(true, "Y")
map.add(false, "N")
# map.item(true)

@("Y","N")[-not( $_.VirtualMemorySize64 -ge 1GB)]

こっちはbool値をint型に変換して(暗黙的でよろしくはないが)、インデックスとして利用。