Powershell 从变量筛选输出(其中对象)

Powershell 从变量筛选输出(其中对象),powershell,active-directory,wmi,where-clause,Powershell,Active Directory,Wmi,Where Clause,我正在服务器上使用以下行运行测试: Get-WmiObject Win32_Service -ComputerName "myserver" -Filter "State='Running'" | where-object ??? }| Foreach-Object { New-Object -TypeName PSObject -Property @{ DisplayName=$_.DisplayName

我正在服务器上使用以下行运行测试:

Get-WmiObject Win32_Service -ComputerName "myserver" -Filter "State='Running'" |
where-object ??? }| Foreach-Object {
                New-Object -TypeName PSObject -Property @{
                    DisplayName=$_.DisplayName
                    State=$_.State
                } | Select-Object DisplayName,State
            # Export all info to CSV
            } | ft -AutoSize
我想创建一个如下所示的变量:

$IgnoreServices = '"Wireless Configuration","Telephony","Secondary Logon"
并将其发送到Where对象。我能做这个吗

Sune:

编辑: 经过一些R/T研究和尝试:我发现我可以做到这一点:

$IgnoreServices = {$_.DisplayName -ne "Wireless Configuration" 
-and $_.DisplayName -ne "Telephony" -and $_.DisplayName -ne "Secondary Logon" 
-and $_.DisplayName -ne "Windows Event Collector"}

Get-WmiObject Win32_Service -ComputerName "myserver" -Filter   "State='Running'"|        where-object $IgnoreServices | Foreach-Object {
                # Set new objects for info gathered with WMI
                New-Object -TypeName PSObject -Property @{
                    DisplayName=$_.DisplayName
                    State=$_.State
                } | Select-Object DisplayName,State
            # Export all info to CSV
            } | ft -AutoSize
但是。。我很想知道是否可以通过以下方式指定要排除的服务: 服务1,服务2,服务3

一如既往,我们非常感谢您的帮助

是的,你可以做:

$IgnoreServices = "Wireless Configuration","Telephony","Secondary Logon"
如您所愿,在where对象中执行以下操作:

where-object { $IgnoreServices -notcontains $_.DisplayName  }

使用WMI筛选器可以更快地执行此操作,而且由于您只选择属性,因此无需创建新对象,请使用select Object cmdlet instaed:

$filter = "State='Running' AND Name <> 'Wireless Configuration' AND Name <> 'Telephony' AND Name <> 'Secondary Logon'"

Get-WmiObject Win32_Service -ComputerName myserver -Filter $filter | Select-Object DisplayName,State

你这个忍者!!很有魅力!!非常感谢你!!谢谢Shay和@manojlds!我将删除我在另一个get wmi中使用的新对象,但我不知道我不需要它。我的黑名单上的服务内容非常广泛。。如何从文本文件读取列表?这将动态构建过滤器,假设您有一个文本文件,每行上都有一个服务名称:$svc=Get Content。\svc.txt | Foreach Object{和name'{0}'-f$}$filter=State='Running'+$svc-join''在get wmi查询中如何使用它?我试过直接用-filter$svc来调用它,但没有用。没关系,我只是有个屁。工作出色!!非常感谢你!此方法将执行得更好,因为筛选器是在初始WMI查询期间执行的,而且Powershell不必将查询返回的每个对象的DisplayName与忽略的服务列表进行比较。当只查询一台计算机时,性能的提高可以忽略不计,但在扩展时,性能的提高是显而易见的。在我的测试中使用measure命令显示WMI过滤器方法快27%。筛选的WMI查询耗时255毫秒,而where对象方法耗时348毫秒。简单提示一下:您不需要选择。选择对象的输出也是一个psobject,因为您选择的是所有源对象属性,所以这是一个冗余操作。