私は、API呼び出しを行い、JSON結果を返し、PowerShellでカスタムオブジェクトの配列として処理されるスクリプトを作成しています。カスタムオブジェクトのプロパティの1つはステータスなので、ユニークなステータスごとに、そのステータスのオブジェクトのカウントを取得したかったのです。あるステータスのコードが0のカウントを返すと、私は驚きました。なぜなら、それが存在しなければ、スクリプトはそのステータスを検索しないからです。Where-Objectはカスタムオブジェクトの単一のインスタンスを検出しませんが、複数のインスタンスを検出します。考えられるバグ?
ステータスを持つ複数のオブジェクトがあるのに、そのステータスのオブジェクトが1つしかないときにコードが動作していたことに気付きました。私のコードはWhere-Objectを使ってコードを見つけられませんでした。カスタムオブジェクトの配列をループしてif()ステートメントを実行すると、1つのオブジェクトしか持たないステータスを含むすべてのステータスが検出されます。
ここに何か不足していますか、これはバグですか?私のラップトップはPS 5.1を実行しており、PS 4.0を実行しているW2K12サーバーでも試してみました。私はまた、以下のコードでは、この(APIとJSON部品を取り外す)をシミュレートすることができました
:上記のサンプルコードで
$testArray = @()
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name1' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status1' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name2' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status2' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name3' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status3' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name4' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status1' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name5' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status1' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name6' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status1' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name7' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status3' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name8' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status3' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name9' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status3' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name10' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status1' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name11' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status1' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name12' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status1' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name13' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status1' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name14' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status3' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name15' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status3' -Force
$testArray += $testObject
$testObject = New-Object -TypeName PSObject
$testObject | Add-Member -type NoteProperty -name Name -value 'Name16' -Force
$testObject | Add-Member -type NoteProperty -name Status -value 'Status3' -Force
$testArray += $testObject
Write-Host "`n`nPowerShell version:"
$PSVersionTable.PSVersion
Write-Host "`n`nUsing Where-Object on the array"
$uniqueStatuses = ($testArray.Status | sort | Get-Unique)
foreach ($status in $uniqueStatuses)
{
$status
($testArray | Select-Object | Where-Object { $_.Status -eq $status }).Count
}
Write-Host "`n`nLooping through the array"
foreach ($status in $uniqueStatuses)
{
$status
[int]$count = 0
foreach ($object in $testArray)
{
if ($object.Status -eq $status)
{
$count++
}
}
$count
}
、状況STATUS2は唯一のカスタムオブジェクトのいずれかで表示されます何らかの理由でWhere-Objectが見つかりませんがforeachを使用しています。
私は上記のコードを実行すると、私が手:
PowerShellのバージョン:
メジャーマイナーリビジョン
どこ-オブジェクトを使用した
を構築アレイ上で
STATUS1
STATUS2
STATUS3
アレイを通してルーピング
STATUS1
とそれだけで返す -STATUS2
最初の例でSTATUS3
を、しかし、*暗黙のうちに*すべてのオブジェクトは、あなたがそれにアクセスするときに、プロパティが追加カウントを取得し、それを返すことを考慮すると、 1、例えば'' 1'.count'(PSv3以降)。明らかに、これはすべての場合に成り立たない。この場合、状況別にグループ化するコードを書き直して、おそらくカウントを取得するでしょう。 – Joey
答えとしてマークしました。明確な説明をありがとう! – Rim