相変わらず 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) で読めば` もエスケープせずに読み取れるので最終手段があるからどーでもよかったです。