Use -notlike to filter out multiple strings in PowerShell

后端 未结 9 503
执念已碎
执念已碎 2020-12-14 15:58

I\'m trying to read the event log for a security audit for all users except two, but is it possible to do that with the -notlike operator?

It\'s somethi

相关标签:
9条回答
  • 2020-12-14 16:24

    In order to support "matches any of ..." scenarios, I created a function that is pretty easy to read. My version has a lot more to it because its a PowerShell 2.0 cmdlet but the version I'm pasting below should work in 1.0 and has no frills.

    You call it like so:

    Get-Process | Where-Match Company -Like '*VMWare*','*Microsoft*'
    Get-Process | Where-Match Company -Regex '^Microsoft.*'
    
    filter Where-Match($Selector,[String[]]$Like,[String[]]$Regex) {
    
        if ($Selector -is [String]) { $Value = $_.$Selector }
        elseif ($Selector -is [ScriptBlock]) { $Value = &$Selector }
        else { throw 'Selector must be a ScriptBlock or property name' }
    
        if ($Like.Length) {
            foreach ($Pattern in $Like) {
                if ($Value -like $Pattern) { return $_ }
            }
        }
    
        if ($Regex.Length) {
            foreach ($Pattern in $Regex) {
                if ($Value -match $Pattern) { return $_ }
            }
        }
    
    }
    
    filter Where-NotMatch($Selector,[String[]]$Like,[String[]]$Regex) {
    
        if ($Selector -is [String]) { $Value = $_.$Selector }
        elseif ($Selector -is [ScriptBlock]) { $Value = &$Selector }
        else { throw 'Selector must be a ScriptBlock or property name' }
    
        if ($Like.Length) {
            foreach ($Pattern in $Like) {
                if ($Value -like $Pattern) { return }
            }
        }
    
        if ($Regex.Length) {
            foreach ($Pattern in $Regex) {
                if ($Value -match $Pattern) { return }
            }
        }
    
        return $_
    
    }
    
    0 讨论(0)
  • 2020-12-14 16:25

    Easiest way I find for multiple searches is to pipe them all (probably heavier CPU use) but for your example user:

    Get-EventLog -LogName Security | where {$_.UserName -notlike "*user1"} |  where {$_.UserName -notlike "*user2"}
    
    0 讨论(0)
  • 2020-12-14 16:36
    $listOfUsernames = @("user1", "user2", "etc", "and so on")
    Get-EventLog -LogName Security | 
        where { $_.Username -notmatch (
            '(' + [string]::Join(')|(', $listOfUsernames) + ')') }
    

    It's a little crazy I'll grant you, and it fails to escape the usernames (in the unprobable case a username uses a Regex escape character like '\' or '(' ), but it works.

    As "slipsec" mentioned above, use -notcontains if possible.

    0 讨论(0)
提交回复
热议问题