使用管道显示已过滤的过滤数据和数据

时间:2015-10-19 08:57:04

标签: powershell scripting pipeline

我有一个我正在研究的powershell项目,它是使用函数从数据库中读取数据,然后我使用管道来过滤该数据以找到我想要的内容。其中一个要求是我应该显示所有不相关的数据以及被过滤的数据。

Get-Foo($Connection) |
Group Bar|
? Count -eq 2 |
? {$_.Group.Foobar -contains "A" -and $_.Group.Foobar -contains "B" -or $_.Group.Foobar -contains "A" -and $_.Group.Foobar -contains "C"} |

所以基本上我想输出所有只包含A和B或只包含A和C的记录,但我也希望显示所有不包含此记录的记录。

Sample Data:
(A, B, C, D, E)
(A, B)
(A, B, C, D)
(A, B, E)
(A)
(A, C)

Current Output:
(A, B)
(A, C)

Required Output
(A, B, C, D, E)
(A, B, C, D)
(A, B, E)
(A) - List all the false outcomes of filtering
(A, B) - Then list the true
(A, C)

1 个答案:

答案 0 :(得分:1)

您可以使用Group-Object代替Where-Object。在这种情况下,您将有两个组:一个用于错误条件,另一个用于true。

$SampleData=@'
Bar,Foobar
1,A
1,B
1,C
1,D
1,E
2,A
2,B
3,A
3,B
3,C
4,D
5,A
5,B
5,E
6,A
7,A
7,C
'@|ConvertFrom-Csv

$SampleData|
Group-Object Bar|
# I am join both your conditions into one.
Group-Object {($_.Count -eq 2) -and (
                   (($_.Group.Foobar -contains 'A') -and ($_.Group.Foobar -contains 'B')) -or
                   (($_.Group.Foobar -contains 'A') -and ($_.Group.Foobar -contains 'C'))
              )}|
# To have false before true.
Sort-Object {$_.Values[0]}|
# Expand groups.
Select-Object @{Name='Condition';Expression={$_.Values[0]}} -ExpandProperty Group|
# Display results to user.
Format-Table -GroupBy Condition