1

我想首先通过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 "----"
}
4

1 回答 1

4

发生这种情况是因为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语句不会影响管道,因为它们只写入控制台。不过老实说,对于其他阅读您的代码的人来说,这有点难以理解。

于 2018-02-09T08:21:26.763 回答