2020年10月3日土曜日

PowerShellでの配列の中のオブジェクトアクセス

以下試してみた結果、PowerShellの配列を正しく指定しなかった場合でもPowerShellが裏で仕事をして、いい感じにデータを採取してくれるみたい。 ただ更新の場合は、オブジェクト位置を正しく示している場合のみ、更新できるみたい。 正しく位置指定をしなかった場合、配列の添え字が入れられていないものは配列全体を走査して、見つかったものを返す。複数みつかれば配列として返してくれるみたい。だけど、当然というか、PowerShellが裏で仕事して引っ張ってきたデータについては、更新がエラーになったり無効となったりしている。 データ構造の理解があいまいだと、値書き換え時に大変なことになりそうな予感がする。 まあ、データ構造を完全把握していれば、データベース的に検索ができそうなきがするが。。。

PS > $a=((1,2,@{a=10;b=11}),(4,5,@{a=20}),(7,8,@{a=30;b=12}))
PS > $a.a
10
20
30
PS > $a.b
11
12
PS > $a.a.length
3
PS > $a.b.length
2
PS > $a.a[0]
10
PS > $a.a[0]=100
PS > $a.a[0]
10
PS > $a[0].a=100
このオブジェクトにプロパティ 'a' が見つかりません。プロパティが存在し、設定可能であることを確認してください。
発生場所 行:1 文字:1
+ $a[0].a=100
+ ~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) []、RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

PS > $a.a
10
20
30
PS > $a[0][2].a
10
PS > $a[0][2].a=100
PS > $a.a
100
20
30
PS > $a.b[1]
12
PS > $a[1].b
PS > $a[0].b
11
PS > $a[2].b
12
PS > $a[2].b=120
このオブジェクトにプロパティ 'b' が見つかりません。プロパティが存在し、設定可能であることを確認してください。
発生場所 行:1 文字:1
+ $a[2].b=120
+ ~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) []、RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

PS > $a.b[1]
12
PS > $a[1].b
PS > $a.b[1]
12
PS > $a.b[1]=120
PS > $a.b
11
12
PS > $a[2][2].b
12
PS > $a[2][2].b=120
PS > $a.b
11
120
PS >

このほか、forなどループ文にたいしても=で結果を変数に代入できるけれど、これはパイプと同じくループ文の塊の中で出力した結果が変数に入るみたい。 使いどころはあるのだけれど、powershellは癖が強いなぁ。 そういえば、メイン?で使っていたブログがサービス終了となっていましたので、つぶやきはこちらだけになりそうです。