我想首先使用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 "----"
}
答案 0 :(得分:2)
这是因为Export-CSV
未输出对象。有时像这样的cmdlet有一个-PassThru
参数,您可以使用该参数传递一个对象,但Export-CSV
不是这种情况,他们只是希望它始终是管道中的最后一个cmdlet。 / p>
你应该这样做:
$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
语句不会影响管道,因为它们正在写入控制台。说实话,对于阅读代码的其他人来说,这有点难以理解。