Powershell-不允许使用空管道元素

Powershell-不允许使用空管道元素,powershell,csv,Powershell,Csv,每当我尝试将结果导出到csv文件时,我总是收到滚动错误消息-“不允许使用空管道元素”。知道为什么会这样吗 $apps = Import-CSV apps.csv $computers = Import-CSV compobj.csv foreach($computer in $computers) { $computerLob = $computer.lob $lobApps = $apps | ? {$_.lob -eq $computerLob} foreac

每当我尝试将结果导出到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循环中,但它只返回最后一条记录。

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

这是一个常见错误,本文和将对此进行更详细的解释

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

$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

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

您不能从任何powershell语句进行管道传输。我不知道为什么

如果。。否则
开关
做而
ForEach
对于

编辑:另一种方式。您可以从调用运算符和脚本块(或函数)进行流式传输。将foreach或任何其他语句放入其中。你不必等到它结束

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

Count             : 3
Average           : 
Sum               : 
Maximum           : 
Minimum           : 
StandardDeviation : 
Property          : 

某些流控制表达式不会对其输出进行流式处理。 但它们可以分配给变量,但不能输出流


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

要执行
导出csv
一次一个对象,请记住添加
-Append
开关。这将允许您识别导致问题的数据。附注:为什么在新的
PSObject
上使用
select
:那只是浪费周期。@Richard谢谢你的回复。你能告诉我你会怎么做吗?还有,我为什么要浪费周期?有没有更好的方法。干杯。我的PS:只需使用
新对象PSObject…
的结果,就不需要执行
选择
(它只创建一个具有命名属性的新PSObject…它重复了
新对象
刚刚做的事情)。