So-net無料ブログ作成
QLOOKアクセス解析

フォーマットストリングと配列 Lengthの副作用? [PowerShell]

実用上困るかというと、そうでもなさそうな細かな話ですが・・・

配列の長さを知るための 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
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番目はエラーになってしまいます。
なぜでしょう。
配列ではなくなったかのように見えます。

とはいえ [] での要素へのアクセスは可能で、たとえば
"{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
nice!(0)  コメント(2)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 2

入海

へーそうなんですか。おかしいですよね。変になった状態での変数$aの型はどうなっているんでしょうね?
by 入海 (2009-02-13 08:37) 

mcmug

Length を呼ぶ前も後も Object[] ですね。。。

PS > $a = 'Xx','Yy','Zz'
PS > "{0}" -f $a
Xx
PS > $a.GetType()

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array


PS > $a.Length
3
PS > "{0}" -f $a
Xx Yy Zz
PS > $a.GetType()

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array

by mcmug (2009-02-13 12:30) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

メッセージを送る
人気ブログランキングへ
 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は1年以上新しい記事の更新がないブログに表示されております。