【问题标题】:Work with ADComputer output in foreach loop在 foreach 循环中使用 ADComputer 输出
【发布时间】:2018-07-19 22:59:05
【问题描述】:
我想首先使用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 "----"
}
【问题讨论】:
标签:
powershell
foreach
module
hostname
computer-name
【解决方案1】:
这是因为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 语句不会影响管道,因为它们仅写入控制台.不过老实说,对于其他阅读您的代码的人来说,这有点难以理解。