Arrays 将数据添加到阵列powershell

Arrays 将数据添加到阵列powershell,arrays,powershell,object,Arrays,Powershell,Object,我不知道为什么输出不能正常工作。有人能给我建议吗。从本质上说,该阵列可以正常工作,但有一个主要问题除外。每次向数组中添加新对象时,它都会用最后输入的对象替换数组中以前的所有对象 我得到了我的对象数组,我只希望它将新的数据对象添加到数组中,而不是替换以前的所有条目并添加新的数据对象 我不知道我做错了什么 $RptInfo = New-Object Object -TypeName PSObject Add-Member -MemberType NoteProperty -Name Counted

我不知道为什么输出不能正常工作。有人能给我建议吗。从本质上说,该阵列可以正常工作,但有一个主要问题除外。每次向数组中添加新对象时,它都会用最后输入的对象替换数组中以前的所有对象

我得到了我的对象数组,我只希望它将新的数据对象添加到数组中,而不是替换以前的所有条目并添加新的数据对象

我不知道我做错了什么

$RptInfo = New-Object Object -TypeName PSObject
Add-Member -MemberType NoteProperty -Name Counted -Value "" -InputObject $RptInfo 
Add-Member -MemberType NoteProperty -Name ItemName -Value "" -InputObject $RptInfo 
Add-Member -MemberType NoteProperty -Name ItemType -Value "" -InputObject $RptInfo 
Add-Member -MemberType NoteProperty -Name LineURI -Value "" -InputObject $RptInfo 
Add-Member -MemberType NoteProperty -Name RegistrarPool -Value "" -InputObject $RptInfo 
Add-Member -MemberType NoteProperty -Name Identity -Value "" -InputObject $RptInfo 
Add-Member -MemberType NoteProperty -Name Office -Value "" -InputObject $RptInfo 
Add-Member -MemberType NoteProperty -Name OfficeName -Value "" -InputObject $RptInfo 
Add-Member -MemberType NoteProperty -Name DisplayName -Value "" -InputObject $RptInfo 
Add-Member -MemberType NoteProperty -Name Location -Value "" -InputObject $RptInfo 
Add-Member -MemberType NoteProperty -Name VoicePolicy -Value "" -InputObject $RptInfo 
Add-Member -MemberType NoteProperty -Name DialPlan -Value "" -InputObject $RptInfo 
[array]$RptArray = @()
$VoicePolicy_Table = Get-CsUser | Where {$_.EnterpriseVoiceEnabled -eq $true} | Sort-Object -Property VoicePolicy | Group-Object -Property VoicePolicy, 'Voice Policy'
$DialPlan_Table = Get-CsUser | Where {$_.EnterpriseVoiceEnabled -eq $true} | Sort-Object -Property DialPlan | Group-Object -Property DialPlan, 'Dial Plan'
foreach ($VP in $VoicePolicy_Table) {
    $RptInfo.Counted = $VP.Count
    $RptInfo.ItemName = $VP.Name
    $RptInfo.ItemType = 'Voice Policy'
    $RptArray += $RptInfo
}
ForEach ($RPT in  $RptArray) {    
    $RPT.ItemName
}

问题是当您这样做时会发生什么:

$RptArray += $RptInfo
您可能认为
$RptInfo
是一种值类型,您正在将一个新值复制到数组中

$RptInfo
实际上是一个参考。在循环中,您只需修改现有对象,然后将对该单个对象的另一个引用添加到数组中

这可能会奏效:

 function New-ReportInfo
{
   $RptInfo = New-Object Object -TypeName PSObject
   Add-Member -MemberType NoteProperty -Name Counted -Value "" -InputObject $RptInfo 
   Add-Member -MemberType NoteProperty -Name ItemName -Value "" -InputObject $RptInfo 
   Add-Member -MemberType NoteProperty -Name ItemType -Value "" -InputObject $RptInfo 
   Add-Member -MemberType NoteProperty -Name LineURI -Value "" -InputObject $RptInfo 
   Add-Member -MemberType NoteProperty -Name RegistrarPool -Value "" -InputObject $RptInfo 
   Add-Member -MemberType NoteProperty -Name Identity -Value "" -InputObject $RptInfo 
   Add-Member -MemberType NoteProperty -Name Office -Value "" -InputObject $RptInfo 
   Add-Member -MemberType NoteProperty -Name OfficeName -Value "" -InputObject $RptInfo 
   Add-Member -MemberType NoteProperty -Name DisplayName -Value "" -InputObject $RptInfo 
   Add-Member -MemberType NoteProperty -Name Location -Value "" -InputObject $RptInfo 
   Add-Member -MemberType NoteProperty -Name VoicePolicy -Value "" -InputObject $RptInfo 
   Add-Member -MemberType NoteProperty -Name DialPlan -Value "" -InputObject $RptInfo
   $RptInfo
}

[array]$RptArray= @()
foreach ($VP in $VoicePolicy_Table)
{
    $RptInfoCopy = New-ReportInfo

    $RptInfoCopy.Counted = $VP.Count
    $RptInfoCopy.ItemName = $VP.Name
    $RptInfoCopy.ItemType = 'Voice Policy'
    $RptArray += $RptInfoCopy
}
或者,如果你喜欢管道

$RptArray = ($VoidPolicy_Table | % {
    $RptInfoCopy = New-ReportInfo

    $RptInfoCopy.Counted = $_.Count
    $RptInfoCopy.ItemName = $_.Name
    $RptInfoCopy.ItemType = 'Voice Policy'
    $RptInfoCopy
})

对我来说,一步迭代$VoidPolicy_表并构建$RptArray并填充三个属性看起来更为严格:

$VoicePolicy_Table = Get-CsUser | Where {$_.EnterpriseVoiceEnabled -eq $true} | Sort-Object -Property VoicePolicy | Group-Object -Property VoicePolicy, 'Voice Policy'
$DialPlan_Table = Get-CsUser | Where {$_.EnterpriseVoiceEnabled -eq $true} | Sort-Object -Property DialPlan | Group-Object -Property DialPlan, 'Dial Plan'

$RptArray = ForEach ($VP in $VoicePolicy_Table) {
    [PSCustomObject]@{
        Counted       = $VP.Count
        ItemName      = $VP.Name
        ItemType      = 'Voice Policy'
        LineURI       = "" 
        RegistrarPool = "" 
        Identity      = "" 
        Office        = "" 
        OfficeName    = "" 
        DisplayName   = "" 
        Location      = "" 
        VoicePolicy   = "" 
        DialPlan      = "" 
    }
}

您创建一次
$RptInfo
,然后每次通过
foreach
循环更新此单个对象,并重复将其添加到数组中。您需要为每次迭代创建一个新对象。我还想补充一点,似乎没有必要手动附加数组。创建时只需输出每个对象。我喜欢这两个选项。。。现在我还有一个问题。我的输出是重复的。是否有一种方法可以正确获取完整记录集的所有唯一记录。类似于$RPTArray=$RPTArray-properties*| select-uniq的东西我知道这在powershell中不太正确。但我想在导出到csv之前删除阵列中的重复记录。我找到了一个可能有效的解决方案。。。正在进行测试$RPTArray=$RPTArray | Select Object*-唯一有什么建议吗?没有,没用谢谢,我对这件事很感兴趣。但是你说的话让我觉得。。。我使用数组作为引用,而不是我想要的值。我喜欢这两个选项。。。现在我还有一个问题。我的输出是重复的。是否有一种方法可以正确获取完整记录集的所有唯一记录。类似于$RPTArray=$RPTArray-properties*| select-uniq,我知道这在powershell中不太正确。但是我想在导出到csv之前从数组中删除重复记录。您的意思是
$RPTArray=$RPTArray | Sort Object-uniq