2016-08-12 9 views
0

私は、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

答えて

4

は(Where-Objectを使用して)、コレクション内のパイプラインの結果は、という保証がありませんなぜなら、Countは何も返さないからです。

配列の部分式演算子@()を使用し、あなたが正しい回数表示されます。ビット悪

$uniqueStatuses = ($testArray.Status | sort | Get-Unique) 
foreach ($status in $uniqueStatuses) 
{ 
    $status 
    @($testArray | Select-Object | Where-Object { $_.Status -eq $status }).Count 

} 
+0

を、しかし、*暗黙のうちに*すべてのオブジェクトは、あなたがそれにアクセスするときに、プロパティが追加カウントを取得し、それを返すことを考慮すると、 1、例えば'' 1'.count'(PSv3以降)。明らかに、これはすべての場合に成り立たない。この場合、状況別にグループ化するコードを書き直して、おそらくカウントを取得するでしょう。 – Joey

+0

答えとしてマークしました。明確な説明をありがとう! – Rim

関連する問題