我有一个字符串数组$Exclude
,我希望将其放入Get-WMIObject
cmdlet中的过滤器中。我最后添加了它,但它不起作用。
如何过滤掉该阵列中列出的服务?
$ServicesToExclude = "RemoteRegistry,CpqNicMgmt"
$Exclude = $ServicesToExclude.split(",")
$Services = Get-WmiObject -Class Win32_Service -Filter {State != 'Running' and StartMode = 'Auto' and Name -ne $Exclude}
$Result = foreach ($Service in $Services.Name)
{
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\$Service" |
Where-Object {$_.Start -eq 2 -and $_.DelayedAutoStart -ne 1}|
Select-Object -Property @{label='ServiceName';expression={$_.PSChildName}} |
get-Service
}
If ($Result.count -gt 0){
$Displayname = $Result.displayname
[string] $Line = "`n-----------------------------------------"
$Api.LogScriptEvent( 'Stopped_Auto_Services.ps1',1234,4,"`nStopped Automatic Services$Line `n$($Displayname)")
答案 0 :(得分:2)
在WMI端未完成从列表中过滤数组。相反,您应该使用SELECT * INTO #tempresults FROM CurrentResults
过滤掉Where-Object
中包含名称的服务。
$Exclude
答案 1 :(得分:0)
WMI查询不适用于数组,需要以不同的方式完成。如果要在服务器端保留过滤,可以在运行命令之前通过创建过滤字符串来完成一些工作,如下所示:
$Exclude = "RemoteRegistry","CpqNicMgmt"
$StringBuilder = New-Object System.Text.StringBuilder
[void]$StringBuilder.Append("State != 'Running' AND StartMode = 'Auto' AND ")
[void]$StringBuilder.Append("($(($Exclude -replace '^(.*)$','Name != "$1"') -join ' AND '))")
$Query = $StringBuilder.ToString()
$Services = Get-WmiObject -Class Win32_Service -Filter $Query
可能有更好的方法来实现这一目标,但这是我能想到的第一个完成问题目标的方法。