사용 - PowerShell에서 여러 문자열을 걸러내는 것을 좋아하지 않습니다.
2명을 제외한 모든 사용자에 대한 보안 감사를 위해 이벤트 로그를 읽으려고 하는데, 그것이 가능할까요?-notlike
오퍼레이터?
이런 거죠.
Get-EventLog -LogName Security | where {$_.UserName -notlike @("*user1","*user2")}
단일 사용자를 위해 다음과 같은 작업을 수행합니다.
Get-EventLog -LogName Security | where {$_.UserName -notlike "*user1"}
V2는 적어도 다음을 포함하고 있습니다.-username
문자열[]을 가져가고 글로빙을 지원하는 매개 변수입니다.
테스트를 다음과 같이 확장하려는 V1:
Get-EventLog Security | ?{$_.UserName -notlike "user1" -and $_.UserName -notlike "*user2"}
또는 인라인 배열에서 "-not contains"를 사용할 수 있지만 이는 사용자 이름에 정확한 일치를 수행할 수 있는 경우에만 사용할 수 있습니다.
... | ?{@("user1","user2") -notcontains $_.username}
피터가 옳은 생각을 한 것 같아요.이에 대해서는 -not match 연산자와 함께 정규 표현을 사용하겠습니다.
Get-EventLog Security | ?{$_.Username -notmatch '^user1$|^.*user$'}
저는 "어떤 시나리오라도 일치"할 수 있도록 읽기 쉬운 함수를 만들었습니다.제 버전은 파워쉘 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 $_
}
사용 안 함 -not Like, -not Match with Regular-Expression은 한 줄에서 작동합니다.
Get-MailBoxPermission -id newsletter | ? {$_.User -NotMatch "NT-AUTORIT.*|.*-Admins|.*Administrators|.*Manage.*"}
여러 검색에서 가장 쉽게 찾을 수 있는 방법은 (아마도 CPU 사용량이 더 많음) 모두 파이프링하는 것이지만, 예를 들어 사용자의 경우 다음과 같습니다.
Get-EventLog -LogName Security | where {$_.UserName -notlike "*user1"} | where {$_.UserName -notlike "*user2"}
시나리오:XX1로 시작하는 모든 컴퓨터를 나열하되 4번째 문자가 L 또는 P인 이름은 나열하지 않습니다.
Get-ADComputer -Filter {(name -like "XX1*")} | Select Name | Where {($_.name -notlike "XX1L*" -and $_.name -notlike "XX1P*")}
위 스크립트를 상위 스크립트로 묶고 다음과 같은 .count 메서드를 추가하여 해당 스크립트를 셀 수도 있습니다.
(Get-ADComputer -Filter {(name -like "XX1*")} | Select Name | Where {($_.name -notlike "XX1L*" -and $_.name -notlike "XX1P*")}).count
선택 문자열 사용:
Get-EventLog Security | where {$_.UserName | select-string -notmatch user1,user2}
$listOfUsernames = @("user1", "user2", "etc", "and so on")
Get-EventLog -LogName Security |
where { $_.Username -notmatch (
'(' + [string]::Join(')|(', $listOfUsernames) + ')') }
좀 이상하지만, 사용자 이름을 피할 수는 없습니다(가능하지 않은 경우 사용자 이름은 '\' 또는 '(')'와 같은 Regex 탈출 문자를 사용하지만 작동합니다).
위에서 언급한 "slipsec"과 같이, 가능하면 -not contains를 사용합니다.
언급URL : https://stackoverflow.com/questions/848859/use-notlike-to-filter-out-multiple-strings-in-powershell
'sourcecode' 카테고리의 다른 글
iPhone ObjectiveC Apps의 C/C++ 정적 라이브러리 사용 (0) | 2023.10.30 |
---|---|
PostgreSQL에 비해 Mysql에 진공이 필요 없는 이유는 무엇입니까? (0) | 2023.10.30 |
페이지를 다시 로드하지 않고 javascript/jQuery를 사용하여 URL 또는 쿼리 문자열을 업데이트하려면 어떻게 해야 합니까? (0) | 2023.10.30 |
란드()는 때때로 같은 것을 연속적으로 반환합니까? (0) | 2023.10.30 |
Postgre와 동치Oracle 9i의 SQL array() / array_to_string() 함수 (0) | 2023.10.30 |