【问题标题】:Filter output (where-object) from variable从变量过滤输出(where-object)
【发布时间】:2012-01-30 22:35:52
【问题描述】:

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

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-Object。我可以这样做吗?

太阳:)

编辑: 经过一些 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"

一如既往,非常感谢所有帮助!

【问题讨论】:

  • 只是一个快速提示:您不需要“选择”。 select-object 的输出也是一个 psobject,因为您选择了所有源对象属性,所以这是一个冗余操作。

标签: powershell active-directory wmi where-clause


【解决方案1】:

是的,你可以这样做:

$IgnoreServices = "Wireless Configuration","Telephony","Secondary Logon"

如你所愿,在 where-object 中执行以下操作:

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

【讨论】:

  • 你忍者!!奇迹般有效!!非常感谢!!
【解决方案2】:

您可以使用 WMI 过滤器来做到这一点(运行速度更快),并且由于您只选择属性,因此无需创建新对象,请使用 Select-Object cmdlet:

$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

【讨论】:

  • 谢谢谢伊和@manojlds!我将删除新对象(我在另一个 get-wmi 中使用它,但不知道我不需要它。)我的“黑名单”服务列表非常广泛。我将如何阅读列表来自文本文件?
  • 这将动态构建过滤器,假设您在每一行都有一个带有服务名称的文本文件: $svc = Get-Content .\svc.txt | Foreach-Object { "AND 名称 '{0}'" -f $_}; $filter = "State='Running' " + ($svc -join ' ')
  • 如何在我的 get-wmi 查询中使用它?我已经直接尝试过,并用 -filter $svc 调用它无济于事..
  • 没关系,我只是脑残。效果很好!!非常感谢!
  • 这种方法的性能会更好,因为过滤器是在初始 WMI 查询期间执行的,并且 Powershell 不必将查询返回的每个对象的 DisplayName 与忽略的服务列表进行比较。仅查询一台计算机时性能改进可以忽略不计,但在扩展时可能会很明显。在我的测试中使用 measure-command 表明 WMI 过滤器方法快 27%。过滤后的 WMI 查询耗时 255 毫秒,而 where-object 方法耗时 348 毫秒。
猜你喜欢
  • 2016-05-21
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多