在 foreach 循环中处理 ADComputer 输出

Work with ADComputer output in foreach loop

我想首先使用 foreach 循环输出网络中的所有主机名,以便(例如)能够 ping 通它们。

但是使用下面的代码我没有在控制台中得到任何输出。 CSV文件会被保存,但是循环中写入的内容不会被执行

有谁知道这是什么原因,我该如何解决?

Import-Module activedirectory
Get-ADComputer -Filter * -Property * | Select Name | Export-CSV -Path $env:TEMP\ZZZEXPORTE.csv -NoTypeInformation -Encoding UTF8 | ForEach {

    $computerName = $_.Name
    Write-Host $computerName
    Write-Host "----"
}

这是因为Export-CSV没有输出对象。有时像这样的 cmdlet 有一个 -PassThru 参数,您可以使用它来传递对象,但 Export-CSV 不是这种情况,它们只是希望它始终是管道中的最后一个 cmdlet。

您应该这样做:

$Computers = Get-ADComputer -Filter * -Property * | Select Name
$Computers | Export-CSV -Path $env:TEMP\ZZZEXPORTE.csv -NoTypeInformation -Encoding UTF8 

$Computers | ForEach {
    $computerName = $_.Name
    Write-Host $computerName
    Write-Host "----"
}

你也可以这样做:

Get-ADComputer -Filter * -Property * | Select Name | ForEach {
    $computerName = $_.Name
    Write-Host $computerName
    Write-Host "----"
    $_
} | Export-CSV -Path $env:TEMP\ZZZEXPORTE.csv -NoTypeInformation -Encoding UTF8 

注意到我们必须将 $_ 添加到我们的 ForEach-Object 循环中,以便它将当前项目输出到管道,但是我们的 Write-Host 语句不会影响管道因为他们只写到控制台。老实说,对于阅读您代码的其他人来说,这有点难以理解。