powershell数组结果因未知原因被截断
我已经拼凑了一个脚本,列出了所有的广告计算机对象,并添加了一些其他信息:也就是说,机器是否可以ping,以及本地管理组的成员是什么。每个数据元素都在一个独立的管道函数中检索 由于未知原因,我正在管道化的对象数组被截断。与GetAdComputer cmdlet返回的883台计算机不同,最终CSV中只剩下约230台计算机 我已经将问题缩小到通过PS远程处理检索本地管理员的命令。我确信有些机器的这个命令失败了,所以可能在某个时候抛出了异常。我假设这样的异常可能会终止循环并删除数组项?我尝试将Invoke命令包装在try/catch中,但这并没有解决问题。仍然缺少数组项 我相信这是一个疏忽。我没有经常使用PS来保持语言语义的清晰。感谢您的帮助powershell数组结果因未知原因被截断,powershell,Powershell,我已经拼凑了一个脚本,列出了所有的广告计算机对象,并添加了一些其他信息:也就是说,机器是否可以ping,以及本地管理组的成员是什么。每个数据元素都在一个独立的管道函数中检索 由于未知原因,我正在管道化的对象数组被截断。与GetAdComputer cmdlet返回的883台计算机不同,最终CSV中只剩下约230台计算机 我已经将问题缩小到通过PS远程处理检索本地管理员的命令。我确信有些机器的这个命令失败了,所以可能在某个时候抛出了异常。我假设这样的异常可能会终止循环并删除数组项?我尝试将Invo
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