[Powershell] PSCustomObject内の入れ子となった配列にアクセスする方法

はじめに

Powershellでは動的なオブジェクトとして「カスタムオブジェクト」が用意されています。

たとえば、下記のように「Select-Object」を渡してあげることでカスタムオブジェクトの要素を作成することができます。

$selectResult = New-Object PSObject | Select-Object AAA, BBB, CCC
$selectResult.AAA = "Test1"
$selectResult.BBB = "Test2"
$selectResult.CCC = "Test3"

$selectResult
$selectResult.GetType().FullName

# Result
AAA   BBB   CCC  
---   ---   ---  
Test1 Test2 Test3
System.Management.Automation.PSCustomObject

PSCustomObjectを作成できていることが確認できます。

今回は配列内に存在するPSCustomObjectに対して入れ子となった配列にアクセスする方法の備忘録となります。

入れ子となったPSCustomObject内の配列を作成する

まずは配列に対してPSCustomObjectを追加します。そのPSCustomObject内に配列を作成します。

$computers = @(
    [PSCustomObject]@{ComputerName = "A0001"; IPAddress = @("11.0.0.1", "12.168.0.1", "192.168.0.1")},
    [PSCustomObject]@{ComputerName = "A0002"; IPAddress = @("11.0.0.2", "192.168.0.2")},
    [PSCustomObject]@{ComputerName = "A0003"; IPAddress = @("12.0.0.2")}
)

$computers

# Result
ComputerName IPAddress                          
------------ ---------                          
A0001        {11.0.0.1, 12.168.0.1, 192.168.0.1}
A0002        {11.0.0.2, 192.168.0.2}            
A0002        {12.0.0.2} 

上記のように IPAddressの名前に対して配列が設定されております。
この配列にアクセスする方法を次章で説明します。

PSCustomObject内の配列にアクセスする

PSCustomObject内の配列に対してアクセスするには「Where-Object」を使うと非常に簡単です。

($computers | Where-Object ComputerName -eq A0001).IPAddress

# Result
11.0.0.1
12.168.0.1
192.168.0.1

上記は、ComputerNameが「A0001」のIPAddressの配列を出力しています。

もしこの配列の最初の値を取得したい場合は

($computers | Where-Object ComputerName -eq A0001).IPAddress[0]

# Result
11.0.0.1

のように「0番目」を指定してあげます。

Whereを使ってアクセスすることもできます。

$computers.Where({ $_.ComputerName -eq 'A0001' }).IPAddress

# Result
11.0.0.1
12.168.0.1
192.168.0.1

Where-Objectを使っても、単純に配列に対するWhereを利用するにしても結果は同じとなります。

すべてのデータに対して一括で出力したい場合は「for文」などを使ってアクセスするのが効果的です。
その場合は、Where-Objectを利用せずに単純に「$i番目」を指定すると良いでしょう。

for ($i = 0; $i -lt $computers.count; $i++) {
    $computers[$i].IPAddress
}

# Result
11.0.0.1
12.168.0.1
192.168.0.1
11.0.0.2
192.168.0.2
12.0.0.2

for文を使わなくても、ForEach-Objectを組み合わせて出力することもできます。

$computers | ForEach-Object IPAddress

# Result
11.0.0.1
12.168.0.1
192.168.0.1
11.0.0.2
192.168.0.2
12.0.0.2

最後に

いかがでしたでしょうか。
PSCustomObject内の配列にアクセスするのはとても簡単で、入れ子になっていてもそれは変わりません。

ご参考になれば幸いです。

タイトルとURLをコピーしました