Powershell Windows

Powershellの@(アットマーク)の意味を解説!

Powershellにおいてしばしば@(アットマーク)が利用されますがその用法は色々あります。ただ@(アットマーク)が配列であることの解説はよく見かけますが、それ以外の用法については触れてない記事も多いんですよね。というわけで今回はPowershellにおける@(アットマーク)の様々な構文について解説していこうと思います。

@(アットマーク)の用法1:配列

まずは1番基本的な用法の一つである配列です。これはネットでググれば無限に記事が出てくると思うのであまりふれませんが、Powershellで配列を宣言する際に@(アットマーク)が利用されます。

$sample = @() //配列の宣言時に@(アットマーク)をつける

$sample += "test1"
$sample += "test2"
$sample += "test3"

Write-Host $sample

----------出力結果----------
test1 test2 test3
----------出力結果----------

@(アットマーク)の用法2:スプラッティング

Powershellにはコマンドの引数にまとめて値を渡せるスプラッティングという機能があります。Microsoftの公式ではこのスプラッティングを利用することでコードを短くすることができ、読みやすくなることがメリットとして挙げられています。

以下のWrite-Hostコマンドレットではメッセージを表示する際に、-BackgroundColorと-ForegroundColorのプロパティを指定することで背景色や文字色を変更することができます。

Write-Host "This is a test." -BackgroundColor "Cyan" -ForegroundColor "Black"

これをスプラッティングを利用して書き換えると以下のようになります。

$Colors = @{ForegroundColor = "black"; BackgroundColor = "cyan"}

Write-Host "This is a test." @Colors

サンプルとして簡単な例を挙げてるのであまり恩恵を感じないかもしれませんが、コマンドレットの引数に色々と記載するよりはコードが簡潔になっているように思えます。このスプラッティングはコマンドレットに限らず関数の引数などにも使えるので、引数が多くなった場合に利用することでスクリプトの可読性があがるでしょう。

@(アットマーク)の用法3:ヒアドキュメント

続いての用法がヒアドキュメントです。ヒアドキュメントは長い文字列を変数に代入したりするような場合に利用されます。文字列を"(ダブルクオーテーション)と'(シングルクオーテーション)で囲む場合がありますが、前者は変数が文章内で展開され、後者は展開されないという違いがあります。

//ダブルクオーテーションで囲った場合
$str1 = "This is a test." 
$str2 = @" //複数行の文字列を代入することができる
$str1
This is some multiple line text.
"@

Write-Host $str2

----------出力結果----------
This is a test.          //$str2中で$str1が展開されている
This is some multiple line text.
----------出力結果----------
//シングルクオーテーションで囲った場合
$str1 = "In PowerShell, You can use here-strings to declare blocks of text."
$str2 = @'
$str1
This is some multiple line text.
'@

Write-Host $str2

----------出力結果----------
$str1                    //$str2中で変数が展開されない
This is some multiple line text.
----------出力結果----------

これを使えばJsonなども小綺麗に扱えますね。

$json = @"
{
 "Name": "Apple",
 "Color": "Red"
}
"@ 

$json | ConvertFrom-Json

**********出力結果**********
Name  Color
----  -----
Apple Red 

**********出力結果**********

-Powershell, Windows