フォーマットストリングと配列 Lengthの副作用? [PowerShell]
実用上困るかというと、そうでもなさそうな細かな話ですが・・・
配列の長さを知るための Length や Count を使うと不思議な副作用があるようなのです。
まず配列を用意します。たとえば文字列の配列。
なぜでしょう。
配列ではなくなったかのように見えます。
とはいえ [] での要素へのアクセスは可能で、たとえば
さらに不思議なことにここで
でアクセスできるようになります。
配列の長さを知るための Length や Count を使うと不思議な副作用があるようなのです。
まず配列を用意します。たとえば文字列の配列。
$a = 'Xx','Yy','Zz'これを次にようにフォーマットストリングを使って
"{0}" -f $aのように出力してみると、
"{1}" -f $a
"{2}" -f $a
Xxとなります。ここで配列の長さを知るために
Yy
Zz
$a.Lengthとすると、当然
3と出力されます。さらに先ほどと同じくフォーマットストリングを使って
"{0}" -f $aのように出力してみると、今度は
"{1}" -f $a
"{2}" -f $a
Xx Yy Zzのようにインデックス0番目を指定したところで全要素が出力され、1番目2番目はエラーになってしまいます。
Error formatting a string: インデックス (0 ベース) は 0 以上で、引数リストのサイズよりも小さくなければなりません。.
At line:13 char:9
+ "{1}" -f <<<< $a
+ CategoryInfo : InvalidOperation: (Xx Yy Zz:PSObject) [], RuntimeException
+ FullyQualifiedErrorId : FormatError
Error formatting a string: インデックス (0 ベース) は 0 以上で、引数リストのサイズよりも小さくなければなりません。.
At line:14 char:9
+ "{2}" -f <<<< $a
+ CategoryInfo : InvalidOperation: (Xx Yy Zz:PSObject) [], RuntimeException
+ FullyQualifiedErrorId : FormatError
なぜでしょう。
配列ではなくなったかのように見えます。
とはいえ [] での要素へのアクセスは可能で、たとえば
"{0} {1} {2}" -f $a[0],$a[1],$a[2]のように記述すれば、
"{0}" -f $a[0]
"{0}" -f $a[1]
"{0}" -f $a[2]
Xx Yy Zzと期待通りの動きをします。
Xx
Yy
Zz
さらに不思議なことにここで
$a += 'Aa'と追加してやるとまた元に戻って
"{0}" -f $a
"{1}" -f $a
"{2}" -f $a
でアクセスできるようになります。
タグ:powershell