2014-02-21 136 views
0

我想知道如何使用谓词过滤器过滤集合$视图。我在C#中看到了很多关于谓词过滤器的例子,但PowerShell并没有多少例子。在PowerShell中看到一个有效的例子会很棒。PowerShell observablecollection谓词过滤器

基本上,当我将过滤器变量设置为字符串并刷新$ view时,集合应该过滤以向我显示与过滤器匹配的行或对象。如果过滤器为空,则应显示整个对象集合。

我认为这应该在控制台中工作,而不使用任何形式,但我还没有能够在PowerShell中创建类型(system.predicate)的过滤器。

$a = New-Object System.Collections.ObjectModel.ObservableCollection[object] 
    $svcs = gsv -ComputerName LocalHost | 
         select @{n="Server";e={$_.machinename}},Name,Displayname,status 

    $svcs | ForEach { 
     $a.Add((
      New-Object PSObject -Property @{ 
       Server = $_.server 
       Name = $_.name 
       Displayname = $_.displayname 
       Status = $_.status 
      } 
     ))  
    } 


    $view = [System.Windows.Data.CollectionViewSource]::GetDefaultView($a) 
    $filter = "bits" 
    $view.Filter = "Predicate FIlter???" 
    $view.Refresh() 

回答

1

只需传递一个脚本块,它接受一个参数。脚本块应该为您想要包含在视图中的项目返回true,对于那些您不想包含的项目则返回false。对我来说,以下的作品上的PowerShell V4:

$view = [System.Windows.Data.CollectionViewSource]::GetDefaultView($a) 
Write-Host "Setting filter to 'vss'" 
$filter = "vss" 
$view.Filter = {param ($item) $item -match $filter} 
$view.Refresh() 
$view 
Write-Host "Setting filter to 'BITS'" 
$filter = "BITS" 
$view.Refresh() 
$view 

编辑:添加打印矿

的测试计算机上的输出在测试计算机导致下面的输出运行上面的脚本:

Setting filter to 'vss' 

        Status Server     Name      Displayname    
        ------ ------     ----      -----------    
       Running LocalHost    SQLWriter    SQL Server VSS Writer 
       Stopped LocalHost    vmicvss     Hyper-V Volume Shado... 
       Stopped LocalHost    VSS      Volume Shadow Copy  
Setting filter to 'BITS' 
       Running LocalHost    BITS      Background Intellige... 
+0

+1只是一个注释:scriptblock可以是'{$ args [0] -match $ filter}'为了简短。 –

+0

@Robert - 真棒! .....我以前用匹配,包含等方式尝试过这样的东西,不知道为什么它以前没有工作,但是这个完成并且完美。谢谢 :) – Kiran