適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話やポイ活など気になったことも載せているブログです。

【PowerShell】ヒア文字の罠に勝手にはまる

PowerShellのヒア文字、便利ですね。

f:id:shinmai_papa:20210127142223p:plain

コードなんかを変数に格納する際など、重宝します。

そんなヒア文字ですが、注意すべき罠があります。

(自分で勝手にはまっているだけ)

この記事では、ヒア文字の恐ろしい罠について紹介しようと思います。

(繰り返しですが、自分ではまっているだけ)

ヒア文字とは

複数行にまたがるような値を変数に格納したい場合に使用するのがヒア文字です。

 
$変数 = @"
 任意の値
 任意の値
 任意の値
 任意の値
"@

$varという変数にヒア文字を使って値を格納してみます。

$var = @"
test1
test2
"@
test1
test2

$var変数に

test1

test2

という2行の文字列が格納されました。

また、PoewrShellの掟に漏れず、"(ダブルクォーテーション)で囲っているところを'(シングルクォーテーション)にすることで中の変数を展開せず、変数の中身を単純な文字列として扱うことができます。

通常の変数との違いは、見てわかるとおり、クォーテーションの前後に@マークがあることです。

ヒア文字の罠

で、これのどこに罠があるの?と思われた方も多いと思います。

私がどハマりした罠は、こんな感じでした。

PS C:\> $var = @"
>> test1
>> test2"@
>>

あれ?

@で囲っているのにヒア文字が終わらない?

さっきの例と何が違うんでしょうか?

さっきのはこんな感じ。

PS C:\> $var = @"
>> test1
>> test2
>> "@

そうですね。

違いは、お尻の「"@」が改行なしで値にくっついていること。

そうなんです。

私がハマった罠は、お尻の"@を変数の値に続けて書いてしまったことで

ヒア文字が閉じられないというものでした。

このように書くと、せっかく@で囲ってもヒア文字の終わりとして認識されません。

通常の変数の感覚だと、そんな固いこと言わずに認識してくれよ!!

と思ってしまうところですが、ヒア文字ではダメです。。

前の@"も値に連続させてしまうとダメ

お尻の"@がダメなら前の@"も改行しないとダメです。

PS C:\> $var = @"test1
>> test2
>> "@
>>

これでは、ヒア文字として認識されません。

ヒア文字として認識させるためには、必ず

"@
任意の値
任意の値
任意の値
"@

という形式をとらなくてはいけません。

"@任意の値
任意の値
任意の値
"@

でも、

"@
任意の値
任意の値
任意の値"@

でも、ヒア文字として正しく認識されません。

ヒア文字として認識させるためには、

前後の@"と"@は必ず、変数の値と別の行に書かなくてはいけません。

最後に

以上が私がハマってしまった罠の一部始終です。

字に起こすと、本当にしょーもないところでハマってしまったと恥ずかしい・・・。

でもハマるときって大体こんな初歩的なところなんですよね。

こんなしょーもない罠にはまるひとがひとりでも減ることを願って

恥を承知で記録しておきます・・・。

ここまでお読みいただき、ありがとうございました。