tech.guitarrapc.cóm

Technical updates

PowerShell の Here-String について

相変わらずbashな日々です。

さて、PowerShellでちょくちょく整列させたりとか、小細工をしたりが多いのですが、ヒア文字列がネタになっていたので1つ。

ヒア文字列 (ヒアストリング)とは

英語好きな人はこれを読めばいいんではないでしょうか。 Windows PowerShell Tip of the Week

例えば、" "の中で" "を使うにはエスケープが必要です。

"`"hello World!!`""

結果、このように出力されます。

"hello World!!"

しかし、ヒアストリングを用いることで、ヒア文字列内部の"のエスケープ処理が不要となります。

@"
"Hello World!!"
"@

結果、このように出力されます。

"Hello World!!"

エスケープ処理以外に"" と @" "@では何か違うのか

違いはありません、検証してみましょう。

a,b,cにそれぞれ代入してみました。

$a = "This is a : hogehoge"
$b = "This is b : line 1
line 2"
$c = @"
This is c : line 1
line 2
"@

1. 表示の差異

$a
$b
$c

ずれはありませんね。

This is a : hogehoge #aの結果
This is b : line 1 #bの結果
line 2
This is c : line 1 #cの結果
line 2

2. 型の差異 当然ありません。

$a.GetType()
$b.GetType()
$c.GetType()

全てStringですね。

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object
True     True     String                                   System.Object
True     True     String                                   System.Object

3. 文字長さ 問題なしです。

$a.Length
$b.Length
$c.Length

改行を含めた記入にも際はありません。

20
26
26

4. 文字の照合

差異が無いか見てみましょう。

PS> diff $bb $cc
InputObject SideIndicator
----------- -------------
          c =>
          b <=

PS> $bb | %{$i=1}{[PSCustomObject]@{char=$_;i=$i};$i++} | Format-Table -AutoSize
char  i
----  -
   T  1
   h  2
   i  3
   s  4
      5
   i  6
   s  7
      8
   b  9
     10
   : 11
     12
   l 13
   i 14
   n 15
   e 16
     17
   1 18
 ... 19
 ... 20
   l 21
   i 22
   n 23
   e 24
     25
   2 26

PS> $cc | %{$i=1}{[PSCustomObject]@{char=$_;i=$i};$i++} | Format-Table -AutoSize
char  i
----  -
   T  1
   h  2
   i  3
   s  4
      5
   i  6
   s  7
      8
   c  9
     10
   : 11
     12
   l 13
   i 14
   n 15
   e 16
     17
   1 18
 ... 19
 ... 20
   l 21
   i 22
   n 23
   e 24
     25
   2 26

まとめ

""でエスケープするのか、ヒア文字列で統一するのか、どちらでも良いですが、むやみに混ざると読みにくいので注意です。

SQLとか、OOの式をそのまま入れる時には便利ですが、"@を新規行の頭に置かないといけないのでフォーマットが崩れます。

どうせなら完全にエスケープされない書式があっても……と思いましたがGet-Content(cat)を使えばエスケープせずに読み取れますね。