7

每当我尝试将结果输出到 csv 文件时,我都会不断收到以下错误消息 - “不允许使用空管道元素”。知道为什么会发生这种情况吗?

$apps = Import-CSV apps.csv
$computers = Import-CSV compobj.csv
foreach($computer in $computers) {    
    $computerLob = $computer.lob
    $lobApps = $apps | ? {$_.lob -eq $computerLob}
    foreach($app in $lobApps){
       $appLocation = $app.location
       $installed=Test-Path "\\$computerHostname\$appLocation"
       $computerHostname = $computer.hostname     
       $results = new-object psobject -property @{Computer=$computer.hostname;App=$app.appname;Installed=$installed} | select Computer,App,Installed 
       $results 
    } 
} | Export-csv "results.csv" -NoTypeInformation

我试过这样做:

$results | Export-csv "results.csv" -NoTypeInformation

在 foreach 循环中,但它只返回最后一条记录。

4

4 回答 4

17

foreach 循环不会输出到管道。您可以通过使循环成为子表达式来做到这一点:

$apps = Import-CSV apps.csv
$computers = Import-CSV compobj.csv
$(foreach($computer in $computers) {    
    $computerLob = $computer.lob
    $lobApps = $apps | ? {$_.lob -eq $computerLob}
    foreach($app in $lobApps){
       $appLocation = $app.location
       $installed=Test-Path "\\$computerHostname\$appLocation"
       $computerHostname = $computer.hostname     
       $results = new-object psobject -property @{Computer=$computer.hostname;App=$app.appname;Installed=$installed} | select Computer,App,Installed 
       $results 
    } 
}) | Export-csv "results.csv" -NoTypeInformation
于 2013-10-29T10:43:49.563 回答
8

我相信您遇到的问题是围绕使用 foreach 和管道,您正在处理 foreach 语句中的项目,但仍然希望它们在管道上。

这是一个常见错误,文章Essential PowerShell:Understanding foreachEssential PowerShell:Understanding foreach (Addendum)中有更详细的解释。

你应该能够像这样实现你想要的:

$apps = Import-CSV apps.csv
$computers = Import-CSV compobj.csv
$computers | foreach {
    $computer = $_
    $computerLob = $computer.lob
    $lobApps = $apps | ? {$_.lob -eq $computerLob}
    $lobApps | foreach {
       $app = $_
       $appLocation = $app.location
       $installed=Test-Path "\\$computerHostname\$appLocation"
       $computerHostname = $computer.hostname     
       new-object psobject -property @{Computer=$computer.hostname;App=$app.appname;Installed=$installed} 
    } 
} | Export-csv "results.csv" -NoTypeInformation
于 2013-10-29T08:51:56.960 回答
4

一些流控制表达式不会流式传输它们的输出。但是它们可以分配给变量,但没有输出流。

您可以将表达式输出流放在子表达式中$(),然后使用另一个命令进行管道传输。

于 2019-04-22T15:15:37.573 回答
0

您不能通过任何 powershell 语句进行管道传输。我不确定为什么。

if .. else
切换
Do .. while
ForEach
For
While

编辑:另一种方式。您可以从呼叫操作员和脚本块(或函数)流式传输。将 foreach 或任何其他语句放入其中。您不必等到它完成。

& { foreach ($i in 1..3) { $i } } | measure

Count             : 3
Average           : 
Sum               : 
Maximum           : 
Minimum           : 
StandardDeviation : 
Property          : 
于 2018-06-01T14:39:06.987 回答