나는 최근 에이 답변을 작성 하고 흥미로운 것을 발견했습니다.
get-aduser -filter {-not (description -eq "auto")} | measure-object
과
get-aduser -filter {description -ne "auto"} | measure-object
동일한 데이터에 대해 실행될 때 첫 번째 명령이 예상 값을 반환하는 두 가지 매우 다른 것을 반환합니다. NULL이 분명히 “auto”와 같지 않더라도 description 필드에 널값을 가진 사용자 는 두 번째 명령에서 일치하는 것으로 리턴 되지 않는 것처럼 보입니다 .
채팅중인 두 사람이 이것을보고 내가 미쳤다는 것을 확인했습니다. 무슨 일이야?
답변
두 명령의 주요 차이점은 첫 번째 명령은 모든 결과를 얻기 위해 값을 직접 비교하지 않고 두 번째 명령은 그렇지 않습니다. 첫 번째 명령에는 NULL 결과가 포함되고 두 번째 명령에는 MDMarra가 이미 검색 한대로 포함되지 않습니다. 두 명령 모두이 cmdlet으로 시작합니다.
get-aduser
아래를 진행할 때이 cmdlet의 결과에는 -filter
매개 변수의 다른 항목에 관계없이 모든 AD 사용자가 포함 됩니다.
이제 다른 두 부분을 나누어 봅시다. 첫번째:
{-not (description -eq "auto")}
…방법
- “description 속성 이 텍스트 문자열”auto ” 와 같은 위치를 파악합니다 .이 비교가 작동하려면
-eq
연산자가”auto “와 비교할 수 있도록 설명 필드에 문자열이 존재해야합니다 . NULL 값은 여기에서 삭제됩니다. NULL을 문자열 값과 비교할 수 없으므로 비교하십시오. - 독립적으로
-eq
filter 매개 변수 는 결과가 아닌 모든 것을 제공(description -eq "auto")
합니다. 원래 cmdletget-aduser
에는 모든 AD 사용자가 포함 되므로 NULL이 포함됩니다 .-not
운영자 와 다른 것을 비교할 필요가 없었습니다 .(description -eq "auto")
필터 결과 이외의 모든 정보 를 제공했습니다.
귀하의 예에서 설명이 “auto”, “auto”이외의 것으로 몇 백, NULL 설명이있는 몇 백 명의 AD 사용자가 있다고 가정합니다. 명령 논리를 단계별로 수행하면 다음이 수행됩니다.
- 설명이 “auto”인 모든 AD 사용자 (get-aduser)를 지정하십시오. 결과는 1 명의 사용자입니다.
- 방금 나에게 준 것이 아닌 모든 AD 사용자를 줘라. 결과는 다른 것을 가진 수백 명과 NULL을 가진 수백 명이다.
-not
연산자를 사용하여 다른 항목과 비교할 필요가 없으므로 원래 get-aduser
cmdlet 에서 캡처 된 NULL 설명 사용자가 결과에 포함되었습니다 .
두 번째 명령 :
{description -ne "auto"}
…방법
- “description 속성 이 정확한 문자열”auto “와 다른 위치를 파악하십시오. 다시이 비교가 작동하려면
-ne
연산자가”auto “와 비교할 수 있도록 설명 필드에 문자열이 존재해야합니다 . NULL 값 NULL을 문자열 값과 비교할 수 없으므로이 비교에서 삭제됩니다.
이 예에서는 설명이 “auto”, “auto”이외의 다른 것의 수백, NULL 설명의 수백 명의 AD 사용자가 있다고 가정합니다. 명령 논리를 단계별로 수행하면 다음이 수행됩니다.
- 설명이 “auto”가 아닌 모든 AD 사용자에게 알려주십시오. 설명에 “auto”이외의 다른 이름을 가진 수백 명의 사용자가 생깁니다. NULL을 텍스트 문자열과 비교할 수 없기 때문에 NULL 설명으로 사용자를 끌어 들이지 않습니다.
어느 쪽이든 두 명령의 전체 차이점은 직관적이지 않습니다.
이 명령을 사용하면 다음과 같이 “-and”로 NULL을 잡을 수 있습니다.
{description -ne "auto" -and description -ne $NULL}
나는 지금 그것을 테스트 할 수 없기 때문에 구문에 100 %가 아니며 아마도 이것보다 더 좋은 방법이있을 것입니다. 모든 것이 분류되면 상당히 반 기후 적이며 설명하기 위해 많은 타이핑이 필요했지만 모든 연산자를 사용하기 전에 이와 같은 이상한 일이 발생했습니다. 모든 경고를 기억할 수 없기 때문에 많은 시행 착오를 겪었습니다 그것은 각각을 사용하는 것과 함께 진행됩니다.
참조 : http://technet.microsoft.com/en-us/library/hh847732.aspx :
비교 연산자
비교 연산자 (-eq, -ne, -gt, -lt, -le, -ge)를 사용하여 값과 테스트 조건을 비교하십시오. 예를 들어 두 문자열 값을 비교하여 값이 같은지 확인할 수 있습니다.
비교 연산자에는 정규 표현식을 사용하여 패턴을 찾는 일치 연산자 (-match, -notmatch)가 포함됩니다. 정규 표현식을 사용하여 입력 값을 변경하는 replace 연산자 (-replace); 와일드 카드 문자 (*)를 사용하여 패턴을 찾는 like 연산자 (-like, -notlike); 테스트 값이 참조 세트에 나타나는지 여부를 결정하는 포함 연산자 (in, -notin, -contains, -notcontains).
또한 비트 패턴 (-bAND, -bOR, -bXOR, -bNOT)을 포함하여 값의 비트 패턴을 조작합니다.
자세한 내용은 about_Comparison_Operators를 참조하십시오.
논리 연산자
논리 연산자 (-and, -or, -xor, -not,!)를 사용하여 조건문을 단일 복합 조건부로 연결하십시오 . 예를 들어, 논리 연산자를 사용하여 두 가지 조건이있는 객체 필터를 만들 수 있습니다.
자세한 내용은 about_Logical_Operators를 참조하십시오.
답변
검색 할 때이 오래된 질문에 추가 :
-ne 또는 -notlike와 같이 음수가 일치하는 -Filter를 사용하면 빈 null 값이있는 결과가 제외됩니다. 이들을 포함 시키려면 -notlike ‘*’ 를 -eq ” 및 -eq $ NULL 이 유효한 필터가 아니므 로 명시 적으로 일치시켜야 합니다. 이것은 직접 -LdapFilter DOES 부정 일치 빈 값을 사용하는 -Filter의 단점입니다.
음수를 사용한 다중 일치의 필터 및 LdapFilter 예는 다음과 같습니다.
Get-ADUser -Filter { mail -like '*example*' -and (description -ne 'example' -or description -notlike '*') }
Get-ADUser -LdapFilter '(&(mail=*example*)(!description=example))'