在PowerShell中调用数组

时间:2015-07-22 14:46:20

标签: arrays powershell

我有一个字符串数组$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)")

2 个答案:

答案 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

可能有更好的方法来实现这一目标,但这是我能想到的第一个完成问题目标的方法。