tech.guitarrapc.cóm

Technical updates

PowerShell の Here-String について

相変わらず bashな日々です。 SAN値がゴリゴリ削られていますが、生きています。 さて、PowerShell でちょくちょく整列させたりとか、小細工をしたりが多いのですが、ヒア文字列がネタになっていたので1つ。

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

英語好きな人はこれを読めばいいんではないでしょうか。
Windows PowerShell Tip of the Week
例えば、通常 " " 内部で " " で囲った文字を表現する場合には内部の"に対してエスケープが必要です。 例えば、Hello World ではなく "Hello World!!" とダブルクォーテーションで囲まれた文字を表現するときは、このようにします。
"`"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. 文字の照合 一応、差異が無いか見てみましょう。
diff $bb $cc
差異はbとcだけですね。
InputObject SideIndicator
----------- -------------
          c =>
          b <=
えっ?もっと細かく見ろ?は、はぃぃ。
$bb | %{$i=1}{[PSCustomObject]@{char=$_;i=$i};$i++} | Format-Table -AutoSize
$cc | %{$i=1}{[PSCustomObject]@{char=$_;i=$i};$i++} | Format-Table -AutoSize
bの結果です。
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
cの結果です。
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) で読めば` もエスケープせずに読み取れるので最終手段があるからどーでもよかったです。