使用-notlike在PowerShell中过滤掉多个字符串

时间:2009-05-11 16:16:00

标签: powershell

我正在尝试阅读事件日志以获取除两个用户之外的所有用户的安全审核,但是是否可以使用-notlike运算符执行此操作?

就是这样:

Get-EventLog -LogName Security | where {$_.UserName -notlike @("*user1","*user2")}

我让它适用于单个用户,例如:

Get-EventLog -LogName Security | where {$_.UserName -notlike "*user1"}

8 个答案:

答案 0 :(得分:32)

V2至少包含带有字符串[]的-username参数,并支持globbing。

V1你想扩展你的测试:

Get-EventLog Security | ?{$_.UserName -notlike "user1" -and $_.UserName -notlike "*user2"}

或者您可以在内联数组中使用“-notcontains”,但这只有在您可以对用户名进行精确匹配时才有效。

... | ?{@("user1","user2") -notcontains $_.username}

答案 1 :(得分:9)

我认为彼得有正确的想法。我会使用正则表达式和-notmatch运算符。

Get-EventLog Security | ?{$_.Username -notmatch '^user1$|^.*user$'}

答案 2 :(得分:7)

为了支持“匹配任何...”场景,我创建了一个非常容易阅读的功能。我的版本有很多,因为它是一个PowerShell 2.0 cmdlet,但我在下面粘贴的版本应该在1.0中工作并且没有多余的装饰。

你这样称呼它:

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 $_

}

答案 3 :(得分:4)

不要使用-notLike,带有Regular-Expression的-notMatch在一行中起作用:

Get-MailBoxPermission -id newsletter | ? {$_.User -NotMatch "NT-AUTORIT.*|.*-Admins|.*Administrators|.*Manage.*"}

答案 4 :(得分:3)

我找到多个搜索的最简单方法是将它们全部管道化(可能更重的CPU使用),但对于您的示例用户:

Get-EventLog -LogName Security | where {$_.UserName -notlike "*user1"} |  where {$_.UserName -notlike "*user2"}

答案 5 :(得分:1)

方案: 列出以XX1开头的所有计算机,但不列出第4个字符为L或P

的名称
Get-ADComputer -Filter {(name -like "XX1*")} | Select Name | Where {($_.name -notlike "XX1L*" -and $_.name -notlike "XX1P*")}

您也可以通过将上述脚本包含在parens中并添加.count方法来计算它们:

(Get-ADComputer -Filter {(name -like "XX1*")} | Select Name | Where {($_.name -notlike "XX1L*" -and $_.name -notlike "XX1P*")}).count

答案 6 :(得分:0)

$listOfUsernames = @("user1", "user2", "etc", "and so on")
Get-EventLog -LogName Security | 
    where { $_.Username -notmatch (
        '(' + [string]::Join(')|(', $listOfUsernames) + ')') }

我有点疯狂,我会授予你,并且它无法逃脱用户名(在无法理解的情况下,用户名使用像'\'或'(')这样的正则表达式转义字符,但它有效。

如上所述,如果可能,请使用-notcontains。

答案 7 :(得分:-1)

是的,但你必须将数组放在

表达式中

... | where { @("user1","user2") -notlike $_.username }

-Oisin