PowerShell observablecollection谓词筛选器
我想知道如何使用谓词过滤器过滤集合$view。我在C#中看到了许多谓词过滤器的示例,但在PowerShell中看到的示例并不多。如果能在PowerShell中看到一个工作示例,那将是一件非常棒的事情PowerShell observablecollection谓词筛选器,powershell,powershell-3.0,Powershell,Powershell 3.0,我想知道如何使用谓词过滤器过滤集合$view。我在C#中看到了许多谓词过滤器的示例,但在PowerShell中看到的示例并不多。如果能在PowerShell中看到一个工作示例,那将是一件非常棒的事情 $a = New-Object System.Collections.ObjectModel.ObservableCollection[object] $svcs = gsv -ComputerName LocalHost | sele
$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()
基本上,当我将filter变量设置为字符串并刷新$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()
只需传递一个包含单个参数的脚本块。对于要包含在视图中的项目,脚本块应返回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...
+1请注意:scriptblock可以是
{$args[0]-match$filter}
以表示简短。@Robert-太棒了。。。。。我以前用match、contains等做过类似的尝试,但我不知道为什么它以前不起作用,但这一个做得很好。谢谢:)