Me hace poco escribí esta respuesta y topé con algo interesante.
get-aduser -filter {-not (description -eq "auto")} | measure-object
y
get-aduser -filter {description -ne "auto"} | measure-object
devuelve dos cosas muy diferentes cuando se ejecuta contra los mismos datos, con el primer comando devolviendo el valor esperado. A primera vista, parece que los usuarios con un valor nulo en el campo de descripción no se devuelven como coincidencias en el segundo comando, aunque NULL claramente no es igual a "auto".
Un par de personas en el chat han mirado esto y verificado que no estoy loco. ¿Que está pasando aqui?
powershell
MDMarra
fuente
fuente
-ne
operador de comparación dentro del-Filter
bloque solamente. Específicamente, cuando el valor de entrada de la comparación es$null
.-notlike
originalmente, pero cambié-ne
después de darme cuenta de que no estaba obteniendo lo que quería. TBH, olvidé que incluso lo había intentado hasta que lo mencionaste, pero también puedo reproducirlo.-eq
/ PoSH-ne
intenta comportarse como un SQL=
/<>
? En SQL,foo = NULL
yfoo <> NULL
siempre devolverá falso, porque NULL es 'incomparable': solo funcionarán los operadores especialesfoo IS NULL
yfoo IS NOT NULL
. El comportamiento debe ser similar en PoSH, donde su-not (foo -eq "bar")
filtro devolvería todo lo que(foo -eq "bar")
devolvió$false
, lofoo -eq $null
que haría. En cambio, ¿qué talif (!foo -or foo -ne "bar")
(SQL equivalentefoo IS NULL OR foo <> 'bar'
)?Respuestas:
La diferencia clave entre los dos es que el primer comando no implica una comparación directa de valores para obtener todos los resultados, y el segundo comando sí. El primer comando incluye resultados NULL y el segundo no (como MDMarra ya descubrió). Ambos comandos comienzan con este cmdlet:
Cuando revise lo siguiente, recuerde que los resultados de este cmdlet incluyen a todos los usuarios de AD, independientemente de cualquier otra cosa en el
-filter
parámetro posterior.Ahora analicemos las dos partes que son diferentes. El primero:
...medio
-eq
operador pueda compararla con" auto ". Los valores NULL se eliminan de esto comparación ya que no puede comparar un valor NULL con un valor de cadena.-eq
El parámetro de filtro me da TODO lo que NO es el resultado de(description -eq "auto")
, que incluirá NULL, porque el cmdlet originalget-aduser
, incluye a todos los usuarios de AD. No tenía que comparar nada con el-not
operador con nada más . Simplemente te dio todo además de cuáles fueron los resultados del(description -eq "auto")
filtro.En su ejemplo, suponga que tiene 1 usuario de AD que tiene una descripción igual a "auto", unos pocos cientos con algo diferente a "auto" y unos pocos cientos con descripciones NULL. Recorriendo la lógica del comando hará:
Como no tenía que comparar nada con el
-not
operador, el resultado incluyó a los usuarios de descripción NULL que se capturaron en elget-aduser
cmdlet original .El segundo comando:
...medio
-ne
operador pueda compararla con" auto ". Valores NULL se eliminan de esta comparación ya que no puede comparar un valor NULL con un valor de cadena.En su ejemplo nuevamente, suponga que tiene 1 usuario de AD que tiene una descripción igual a "auto", unos pocos cientos con algo diferente a "auto" y unos pocos cientos con descripciones NULL. Recorriendo la lógica del comando hará:
De cualquier manera, la diferencia entre los dos comandos es definitivamente no intuitiva.
Usando este comando, deberías poder atrapar los NULL con un "-y" allí también así:
No estoy 100% en la sintaxis ya que no puedo probarlo en este momento, y probablemente también haya una mejor manera de hacerlo. Cuando todo está descompuesto, es bastante anti-climático y me costó mucho explicarlo, pero me he encontrado con cosas raras como esta antes de usar los diversos operadores y muchas pruebas y errores, ya que nunca puedo recordar todas las advertencias. que van junto con el uso de cada uno.
Referencia: http://technet.microsoft.com/en-us/library/hh847732.aspx :
fuente
Agregando a esta vieja pregunta como surge cuando busca:
El uso de -Filter con coincidencia negativa, como -ne o -notlike, excluye los resultados con valores nulos vacíos. Para que se incluyan, también debe hacer coincidir explícitamente el uso de -notlike '*' como -eq '' y -eq $ NULL no son filtros válidos. Tenga en cuenta que esta es una peculiaridad con -Filter, utilizando un -LdapFilter directo que hace coincidir los valores vacíos negativos.
Aquí hay un ejemplo de filtro y LdapFilter de coincidencia múltiple con negativo:
fuente