PowerShellの文字列フォーマット変換はPythonと似ているかも

遅寝早起きでちょっとグッタリしているbonlifeです。
PowerShellでは Format-List、 Format-Table などを使って様々な出力が出来ますが、自分の思い通りの出力をしたい時もありますよね。そんな時には文字列をフォーマットする魔法の -F です。Pythonでのモジュロ演算子を使った文字列フォーマット変換とよく似ている気がします。きっと気のせいです。
とりあえず、メモリを多く使っているプロセスTOP10を出力するワンライナーを書いてみました。

Get-Process | Sort-Object PagedMemorySize -Descending | Select-Object -First 10 | %{" {0,-20}:{1,10:#,###.0} MB" -F $_.ProcessName, ($_.PagedMemorySize/1MB)}

出力は以下のような感じです。

 firefox             :      81.2 MB
 powershell          :      28.9 MB
 svchost             :      23.1 MB
 fenrir              :      18.8 MB
 vmserverdWin32      :      15.4 MB
 B2                  :      14.2 MB
 explorer            :      13.4 MB
 winlogon            :       7.1 MB
 sbmgrnt             :       6.4 MB
 answers             :       6.1 MB

powershell、たいしたことしてないのに30MB弱も使ってるのかぁ…、あ、VMware使ってるつもりなかったのにプロセス立ち上がって15MBも使ってる!answersの英英辞書なんて使ってないよなぁ…なんて分析は置いておいて。ワンライナーの最後のパイプ以降にご注目。ExcelとかVB.NET Frameworkに慣れている人にはだいたい分かりそうな型の書式設定を使ってます。中括弧を使った書式設定は違和感がありますが、慣れの問題ですね、きっと。

[参考]

そうそう、最後の部分で ($_.PagedMemorySize/1MB) としてますが、MBは特別な意味を持っています。前に数字が来た場合、1048576 を意味する定数みたいに扱われるっぽいです。KB、GBも同様にそれぞれ 1024、1074790400 として計算に使われます。以下のような感じです。

PS C:\test> 1KB
1024
PS C:\test> 1MB
1048576
PS C:\test> 1GB
1073741824
PS C:\test> 3KB
3072
PS C:\test> 1MB + 1GB
1074790400

GBは 1024 * 1024 * 1024 で…とか意識せずに気軽に変換できて便利のような、そうでもないような。
そうそう、このあたりの情報を調べてみたら、id:newpopsさんのところに全部載ってました。この人、あの本書いてる人なんですね。なるほど、なるほどです。勉強になります。