在foreach循环中使用ADComputer输出

时间:2018-02-09 08:11:43

标签: powershell foreach module hostname computer-name

我想首先使用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 "----"
}

1 个答案:

答案 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语句不会影响管道,因为它们正在写入控制台。说实话,对于阅读代码的其他人来说,这有点难以理解。