2014-02-21 175 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