[PowerShell] ファイルを読み込む際のひと手間

たまにはPowerShellの話題を書いてみよう。
# スクリプトをしない方にはこの上なくつまらんエントリになります!
ファイルを読み込んで、行ごとに処理を行いたい場合、例えばCSVファイルを処理したい場合などに利用します。
いくつかやり方がありますが、私はよくGet-Contentコマンドレットを使用します。

$lines = Get-Content $path

ここで$pathはファイルパスを指定します。
あとはforeachで各行を取り出して処理すればよい、と。

foreach ($line in $lines) {
# 各行が$lineに代入されるので、それを使用して処理
}

ただしこの方法だと1つだけ面倒なことがあります。
(そもそもテキストファイルじゃない、という話は別として)
入力するテキストファイルが1行の場合は上記のスクリプトでは都合が悪いです。
上記Get-Contentでテキストファイルを読み込むと、$linesには配列として代入されます。
配列の各要素に各行が入るイメージです。
例えばテキストファイルが以下のようなものの場合、

abc
123
あいうえお

$lines[0] = "abc"、$lines[1] = "123"、$lines[2] = "あいうえお"となります。想定通り。
しかし、テキストファイルが1行の場合、

abc

$linesは配列ではなく文字列になります。
なので、$lines[0] = "a"、$lines[1] = "b"、$lines[2] = "c"というように1文字ずつ入ります。
文字列1行でも行として処理したいのに、結果文字に対して処理をするため想定した処理にはなりません。

テキストファイルが1行でも処理するようにする場合は以下のように記載します。

$lines = (Get-Content $path) -as [string[]]

これにより$lines[0] = "abc"となります。もちろん複数行取り込んだ場合でも上記と同様の処理となります。
なので、テキストファイルであることが確定しているのであればこちらで書いた方が良いですね。