2016-08-12 28 views
0

我工作的一个脚本,它的API调用,并返回JSON结果和PowerShell中的自定义对象的数组进行处理。自定义对象的其中一个属性是Status,因此对于每个唯一状态,我想获得具有该状态的对象的计数。当我的某些状态代码返回一个0的计数时,我感到很惊讶,因为如果它不存在,我的脚本就不会搜索这个状态。Where-Object没有找到自定义对象的单个实例,但找到了它的多个实例。可能的错误?

我注意到,然后当有与状态的多个对象,但是当只有一个物体与状态,我的代码将无法使用位置对象发现它的代码工作。如果我遍历自定义对象数组,并执行if()语句,它将查找所有状态,包括只有一个对象的状态。

我失去了一些东西在这里或者这是一个错误?我的笔记本电脑运行的是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 
} 

在上面的示例代码中,状态2状态只出现在自定义对象的一个Where-Object由于某种原因没有找到它,但使用foreach。

当我运行上面的代码,我得到:

PowerShell的版本:

主要次要构建版本


使用位置对象在阵列上

状态1

状态2

STATUS3

通过阵列

循环状态1

状态2

STATUS3

回答

4

在第一个例子(使用Where-Object),但也不能保证这条管道结果的收集 - 与Status2它只返回单个对象,这就是为什么Count不返回任何内容。

使用数组子表达式运算符@(),你会看到正确的计数:

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

} 
+0

几分邪气,不过,考虑到*隐含*每个对象都将获得一个Count属性添加,当你访问它,它返回1,例如''1'.count'(自PSv3左右)。显然这并不适用于所有情况。在这种情况下,我可能会重写代码以按状态进行分组,这也可以让您知道计数。 – Joey

+0

标记为答案。感谢您的明确解释! – Rim