PowerShell:String を String で分割する

執筆日時:

まだまだ PowerShell がカタコトしかしゃべれないチンカスですが、皆様はいかがお過ごしでしょうか。

さて、この間こんな感じのコードを書いたんですよ。

$text = 'Microsoft Edge on Windows 10 Version 1511 for x64-based Systems'

$text.Split(' on ‘)[-1]

意図としては、文字列を“ on ”で分割して後ろ部分“Windows 10 Version 1511 for x64-based Systems”を取り出したい、みたいな感じだったのですが……結果はこうでした

Systems

そもそも String.Split() のシグネチャを間違えて雰囲気で書いてしまっているので正しく動作するはずはないのですが、一瞬なんでこんな結果になるのかわからず ( ;´Д`)? となってしまいました。

ちょっと考えたらわかるのですが、' on 'char の配列として解釈され、.NET でいうところの

text.Split(new char[] { ' ', 'o', 'n', ' ' })

が実行されたんですね?(C# ならコンパイルエラーで止まる、というか、IntelliSense が補ってくれるから間違えない) ためしに | write と書き足してみたところ、ぐちゃぐちゃに引き裂かれた文字列たちが出力されました(´;ω;`)ウッ…

でも、これちょっと面白いかも。文字列を文字列で分割したい場合、.NET だと String.Split(string[], StringSplitOptions) を使えばよいので、PowerShell だとこんな感じになるみたいです。

// text.Split(new string[] { " on " }, StringSplitOptions.None) のつもり

$text.Split(@(" on "), 'None')[-1]

これでいいのかイマイチよくわかっていないのですが、これで意図通りに動きました。

Windows 10 Version 1511 for x64-based Systems

ちょっと気持ち悪いような、なるほど、みたいな、不思議な感じ。でも、みなさんは PowerShell なのだから PowerShell っぽく書くのがよいと思います。

($text -split ' on ')[-1]

-split 演算子というのが用意されているので、これを使えばいいでしょう。なんか正規表現も使えるらしいぜ?

まだまだ PowerShell がちゃんとしゃべれなくて恥ずかしいですが、少しずつ使いこなせるようになりたいと思います。