Eu escrevi recentemente essa resposta e me deparei com algo interessante.
get-aduser -filter {-not (description -eq "auto")} | measure-object
e
get-aduser -filter {description -ne "auto"} | measure-object
retorne duas coisas muito diferentes quando executadas nos mesmos dados, com o primeiro comando retornando o valor esperado. Parece à primeira vista que usuários com um valor nulo no campo de descrição não são retornados como correspondências no segundo comando, mesmo que NULL claramente não seja igual a "automático".
Algumas pessoas no chat analisaram isso e verificaram que não sou louco. O que está acontecendo aqui?
powershell
MDMarra
fonte
fonte
-ne
operador de comparação apenas dentro do-Filter
bloco. Especificamente, quando o valor de entrada da comparação é$null
.-notlike
originalmente, mas mudei para-ne
depois que percebi que não estava conseguindo o que queria. TBH, esqueci que tinha tentado isso até você mencionar - mas também posso reproduzi-lo.-eq
/ PoSH-ne
tente se comportar como um SQL=
/<>
? No SQL,foo = NULL
efoo <> NULL
sempre retornará false, porque NULL é 'incomparável' - apenas os operadores especialfoo IS NULL
efoo IS NOT NULL
irão funcionar. O comportamento deve ser semelhante no PoSH, onde seu-not (foo -eq "bar")
filtro retornaria tudo o que(foo -eq "bar")
retornasse$false
, o quefoo -eq $null
seria. Em vez disso, que talif (!foo -or foo -ne "bar")
(SQL equivalentefoo IS NULL OR foo <> 'bar'
)?Respostas:
A principal diferença entre os dois é que o primeiro comando não envolve uma comparação direta de valores para obter todos os resultados, e o segundo comando. O primeiro comando inclui resultados NULL e o segundo não (como o MDMarra já descobriu). Ambos os comandos começam com este cmdlet:
Ao analisar o abaixo, lembre-se de que os resultados desse cmdlet incluem todos os usuários do AD, independentemente de qualquer outra coisa no
-filter
parâmetro após ele.Agora vamos dividir as duas partes que são diferentes. O primeiro:
...significa
-eq
operador possa compará-la com" auto ". Valores nulos são eliminados comparação, pois não pode comparar um NULL a um valor de sequência.-eq
O parâmetro filter fornece-me TUDO que NÃO é o resultado de(description -eq "auto")
, que incluirá NULLs, porque o cmdlet originalget-aduser
inclui todos os usuários do AD. Não era necessário comparar nada com o-not
operador. Apenas lhe deu tudo, além dos resultados do(description -eq "auto")
filtro.No seu exemplo, suponha que você tenha 1 usuário do AD com a descrição igual a "auto", algumas centenas com algo diferente de "auto" e algumas centenas com descrições NULL. Percorrendo a lógica de comando, ele fará:
Como não era necessário comparar nada com o
-not
operador, o resultado incluiu a descrição NULL de usuários capturados noget-aduser
cmdlet original .O segundo comando:
...significa
-ne
operador possa compará-la com" auto ". Valores NULL são descartados dessa comparação, pois não é possível comparar um NULL a um valor de sequência.No seu exemplo, novamente, suponha que você tenha 1 usuário do AD com a descrição igual a "auto", algumas centenas com algo diferente de "auto" e algumas centenas com descrições NULL. Percorrendo a lógica de comando, ele fará:
De qualquer maneira, toda a diferença entre os dois comandos é definitivamente não intuitiva.
Usando este comando, você poderá capturar os NULLs com um "-and" também, como este:
Não sou 100% da sintaxe, pois não posso testá-la agora, e provavelmente existe uma maneira melhor de fazer isso do que isso também. Quando tudo está quebrado, é bastante anti-climático e demorou bastante para ser explicado, mas já me deparei com coisas estranhas como essa antes de usar os vários operadores e muitas tentativas e erros, pois nunca consigo me lembrar de todas as advertências que combinam com o uso de cada um.
Referência: http://technet.microsoft.com/en-us/library/hh847732.aspx :
fonte
Adicionando a essa pergunta antiga conforme ela aparece ao pesquisar:
O uso de -Filter com correspondência negativa, como -ne ou -notlike, exclui resultados com valores nulos vazios. Para que eles sejam incluídos, você também precisa corresponder explicitamente usando -notlike '*' como -eq '' e -eq $ NULL não são filtros válidos. Observe que isso é uma peculiaridade com -Filter, usando um negativo -LdapFilter DOES corresponde a valores vazios.
Aqui está um exemplo de filtro e LdapFilter de correspondência múltipla com negativo:
fonte