PowerShellでhashを書いてさくっとJSONを生成する

こんにちは、PowerShellが好きなwakです。

kimoto.hatenablog.com

こんな記事を読んだので、さくっとPowerShell版も書いておきます。

f:id:nurenezumi:20151023091935j:plain

ねこのひらき(を再度閉じたやつ)

やってみる

何も考えずにPowerShellを立ち上げて、以下のブロックをコピペしてください。*1

# とりあえずハッシュを用意する
$hash = @{
   Number = 123;
   String = "ABCあいう";
   Object = @{ a = "A"; b = 1; };
}
# 後からハッシュに要素を追加してみる
$hash.Array = @(1, 2, 3)
$hash | ConvertTo-Json

実行結果はこうなります。

f:id:nurenezumi:20151022175708p:plain

インデントが邪魔なときは -Compress オプションを付けると1行に圧縮してくれます。

f:id:nurenezumi:20151022175753p:plain

簡単な説明

PowerShellでは、

  • ハッシュは@{Key1=1; Key2=2; Key=3;} の書式で記述します。最後のセミコロンはあってもなくても構いません。
  • 配列は @("value1", "value2", "value3") の書式で記述します。残念ながら余計なカンマは許容されません。

結果をクリップボードにコピーする

末尾に | clip と付ければ結果をクリップボードへコピーすることができます。これが一番簡単です。

$hash | ConvertTo-Json | clip

ただ、結果の中に非ASCII文字が入っていると文字化けしてしまいます(上述の「あいう」など)。ちょっとだけ面倒ですが対応は可能です。まず次のブロックをコピペして(最初の1回だけでOKです)、テキストをクリップボードにコピーするための関数を定義しておきましょう。

function Out-ClipBoard
{
    param([parameter(Mandatory=$true,
            ValueFromPipeline=$true)][object[]]$InputObject)
    begin
    {
        Add-Type -AssemblyName System.Windows.Forms
        $tb = New-Object System.Windows.Forms.TextBox
        $tb.Multiline = $true
        $tb.MaxLength = 0
        $out=@()
    }
    process
    {
        $out+=$InputObject
    }
    end
    {
        $tb.Text = $out -join "`r`n"
        $tb.SelectAll()
        $tb.Copy()
    }
}

これは内部的にWindows Formのテキストボックスを生成し、テキストをセット・全選択・コピーするという力業で実現しています。この準備をしておいた上で、末尾に| Out-ClipBoardを付ければ結果をクリップボードへ正しくコピーすることができます。

$hash | ConvertTo-Json | Out-ClipBoard

結果をファイルに出力する

\記号のエスケープは必要ありません。

$hash | ConvertTo-Json | Out-File "c:\temp\hoge.txt" -Encoding UTF8

こんなところです。

*1:なお、PowerShell 3.0以降が必要です。普通の環境では特に気にする必要はありませんが、Windows Server 2008 R2を更新せずに使っているような人は諦めてください。