Powershell

Powershellでヒアドキュメント内でハッシュ変数を使う方法

Powershell

Powershellではヒアドキュメントを使うことで複数行をまとめて表示することができます。

また、ヒアドキュメントの内部でも変数を使うことができます。

ただし、変数がハッシュのような「$aaaa.bbb」のような形だと前方の「$aaa」だけが先に展開されてしまって、思ったようなデータを表示することができませんでした。

そこで、ヒアドキュメント内でハッシュを表示する方法について調査したのでメモしておきます。

ググってもほどんどこれに関する情報はありませんでした。

PowerShellのヒアドキュメントの書き方

PowerShellだとこんな感じでヒアドキュメント書きます。注意としてはダブルクォーテーション(”)でないと変数が展開されません。

$変数名 = @"
文字列
 :
文字列
"@

ヒアドキュメント内でハッシュ変数を表示する場合

で、本題のヒアドキュメント内でハッシュ変数を表示する場合です。

例として以下を考えます。「$hash.name」の変数が展開されて値であるname01と表示されるのを期待しています。

#ハッシュに値を代入
$hash=@{}
$hash.name = "name01"
$hash.email= "bbbb@test.com"

# ヒアドキュメント内でnameを表示したい
$tmp = @"
aaa
bbb
$hash.name
$hash
ccc
"@
# 表示
Write-host $tmp

だが、この場合には結果は以下のようになります。hashがそのまま表示されてしまいます。

PS C:\Powershell> C:\Powershell\hirdodc.ps1
aaa
bbb
System.Collections.Hashtable.name
System.Collections.Hashtable
ccc

要はドットで区切られている前半がそのまま表示されてしまってるのですね。

と、いうことはドットも含めて変数として認識させないといけないので、こんな感じで書いてみます。

ポイントは$($hash.name)として変数としての区切りを明確にしたところです。

#ハッシュに値を代入
$hash=@{}
$hash.name = "name01"
$hash.email= "bbbb@test.com"

# ヒアドキュメント内でnameを表示したい
$tmp = @"
aaa
bbb
$($hash.name)
$hash
ccc
"@
# 表示
Write-host $tmp
PS C:\Powershell> C:\Powershell\hirdodc.ps1
aaa
bbb
name01
System.Collections.Hashtable
ccc

実行すると期待している通りにハッシュの値が表示されました。

今回は以上となります。

コメント