1

我想知道如何使用谓词过滤器过滤集合 $view。我在 C# 中看到了许多谓词过滤器的示例,但对于 PowerShell 来说并不多。很高兴在 PowerShell 中看到一个工作示例。

基本上,当我将过滤器变量设置为字符串并刷新 $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()
4

1 回答 1

3

只需传递一个带有单个参数的脚本块。对于您想要包含在视图中的项目,脚本块应该返回 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...
于 2014-02-21T13:40:47.060 回答