powershell数组结果因未知原因被截断

powershell数组结果因未知原因被截断,powershell,Powershell,我已经拼凑了一个脚本,列出了所有的广告计算机对象,并添加了一些其他信息:也就是说,机器是否可以ping,以及本地管理组的成员是什么。每个数据元素都在一个独立的管道函数中检索 由于未知原因,我正在管道化的对象数组被截断。与GetAdComputer cmdlet返回的883台计算机不同,最终CSV中只剩下约230台计算机 我已经将问题缩小到通过PS远程处理检索本地管理员的命令。我确信有些机器的这个命令失败了,所以可能在某个时候抛出了异常。我假设这样的异常可能会终止循环并删除数组项?我尝试将Invo

我已经拼凑了一个脚本,列出了所有的广告计算机对象,并添加了一些其他信息:也就是说,机器是否可以ping,以及本地管理组的成员是什么。每个数据元素都在一个独立的管道函数中检索

由于未知原因,我正在管道化的对象数组被截断。与GetAdComputer cmdlet返回的883台计算机不同,最终CSV中只剩下约230台计算机

我已经将问题缩小到通过PS远程处理检索本地管理员的命令。我确信有些机器的这个命令失败了,所以可能在某个时候抛出了异常。我假设这样的异常可能会终止循环并删除数组项?我尝试将Invoke命令包装在try/catch中,但这并没有解决问题。仍然缺少数组项

我相信这是一个疏忽。我没有经常使用PS来保持语言语义的清晰。感谢您的帮助

Import-Module active*
 

$now=(Get-Date).ToString("yyyyMMddTHHmmss")
Get-ADComputer -Filter   'Name -like "prod-idfi*"' -Properties LastLogonDate, Description |select LastLogonDate,DNSHostName,DistinguishedName,Description   |foreach{
 
  
    $alive = Test-Connection -CN $_.DNSHostName  -Count 1 -BufferSize 16 -Quiet

 
    return [PSCustomObject]@{
    PSTypeName = "Computer"
    Id=$null
    Name = $_.DNSHostName
    IsAlive = If($alive) {1} Else {0}
    DistinguishedName = $_.DistinguishedName
    Description = $_.Description
    LastLogonDate = $_.LastLogonDate
    LocalAdmins=''
   
    }
 
    

}|foreach{
    
  $computer = $_
  if ($computer.IsAlive){
    
  try{
          $localAdmins = Invoke-Command -ComputerName $_.Name {([ADSI]"WinNT://./Administrators").psbase.Invoke('Members') | % { ([ADSI]$_).InvokeGet('AdsPath')}} 
          $computer.LocalAdmins= "$($localAdmins -join ",")" 
          }
  catch {
      Write-Host ("something bad happened")
  }
        
  }
  $computer
    
} |Export-Csv ".\ComputerInventory_$now.csv" -NoTypeInformation

您不需要通过管道连接到第二个ForEach对象,因为所有操作都可以在第一个循环内完成。此外,可以省略
选择对象

为了在非终止错误上也输入
catch
块,您需要在Invoke命令中添加参数
-ErrorAction Stop

你的代码被重写了

Import-Module Active*

$now = (Get-Date).ToString("yyyyMMddTHHmmss")
$localGroup = 'Administrators'
Get-ADComputer -Filter "Name -like 'prod-idfi*'" -Properties LastLogonDate, Description |
    ForEach-Object {
        $alive = Test-Connection -ComputerName $_.DNSHostName -Count 1 -BufferSize 16 -Quiet
        $localAdmins = if ($alive) {
            try {
                Invoke-Command -ScriptBlock {
                    ([ADSI]"WinNT://./$localGroup").psbase.Invoke('Members') | 
                     ForEach-Object { ([ADSI]$_).InvokeGet('AdsPath') -join ', '}
                } -ErrorAction Stop
            }
            catch {
                Write-Warning "Could not retrieve members of the local '$localGroup' group"
            }
        }
        else { '' }
        [PSCustomObject]@{
            PSTypeName        = "Computer"
            Id                = $null
            Name              = $_.DNSHostName
            IsAlive           = [int]$alive
            DistinguishedName = $_.DistinguishedName
            Description       = $_.Description
            LastLogonDate     = $_.LastLogonDate
            LocalAdmins       = $localAdmins
        }
    } | Export-Csv -Path ".\ComputerInventory_$now.csv" -NoTypeInformation