将管道与 ForEach-Object 一起使用,而不是使用 foreach( in ) 构造。使用 ForEach-Object 会将命令作为管道的一部分运行,这将允许您将输出捕获为变量。
$PingMachines=import-Csv -path C:\temp\pcs.csv -Header cn,operatingsystem,LastLogonDate
$PingMachines.cn | ForEach-Object {
$PingStatus = Gwmi Win32_PingStatus -Filter "Address = '$_'" | `
Select-Object StatusCode
If ($PingStatus.StatusCode -eq 0){
Write-Host $_ "up"
}
Else {
Write-Host $_ "down"
}
}
你可以这样想管道版本的 $_ 自动变量:
foreach( $_ in $PingMachines.cn) {
#code that uses $_
}
一旦你有一个管道,你需要输出一个对象,而不是仅仅使用 Write-Host 打印到屏幕上:
$PingMachines=import-Csv -path C:\temp\pcs.csv -Header cn,operatingsystem,LastLogonDate
$PingResults = $PingMachines.cn | ForEach-Object {
$PingStatus = Gwmi Win32_PingStatus -Filter "Address = '$_'" | `
Select-Object StatusCode,Address
#I added the Address property above so you would have the machine name in the output object
If ($PingStatus.StatusCode -eq 0){
Write-Host $_ "up"
}
Else {
Write-Host $_ "down"
}
#Send the $PingStatus object out on the pipeline, which will end up in $PingResults
Write-Output $PingStatus
}
June Blender 最近在powershell.org上发表了一篇很好的文章,其中涵盖了输出对象与 Write-Host 以及创建自定义对象,所以我不会在这里详细介绍。