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:
get-aduser
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:
{-not (description -eq "auto")}
...medio
- "averiguar dónde el atributo de descripción es igual a la cadena de texto" auto ". Para que esta comparación funcione, es necesario que exista una cadena en el campo de descripción para que el
-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.
- independientemente de la
-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 original get-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á:
- Déme todos los usuarios de AD (get-aduser) donde la descripción sea igual a "auto" - resulta en 1 usuario
- Dame todos los usuarios de AD que NO son lo que me acabas de dar: el resultado son los pocos cientos con algo más Y los pocos cientos que tienen NULL.
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 el get-aduser
cmdlet original .
El segundo comando:
{description -ne "auto"}
...medio
- "averiguar dónde el atributo de descripción no es igual a la cadena exacta" auto ". Nuevamente, para que esta comparación funcione, es necesario que exista una cadena en el campo de descripción para que el
-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á:
- Déme todos los usuarios de AD donde la descripción no sea igual a "auto": los cientos de usuarios tienen algo diferente a "auto" en su descripción. No atrae a los usuarios con descripciones NULL porque no puede comparar un NULL con una cadena de texto.
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í:
{description -ne "auto" -and description -ne $NULL}
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 :
Operadores de comparación
Utilice operadores de comparación (-eq, -ne, -gt, -lt, -le, -ge) para comparar valores y condiciones de prueba. Por ejemplo, puede comparar dos valores de cadena para determinar si son iguales.
Los operadores de comparación incluyen los operadores de coincidencia (-match, -notmatch), que encuentran patrones utilizando expresiones regulares; el operador de reemplazo (-replace), que usa expresiones regulares para cambiar los valores de entrada; operadores similares (-like, -notlike), que encuentran patrones usando caracteres comodín (*); y los operadores de contención (en, -notin, -contains, -notcontains), que determinan si un valor de prueba aparece en un conjunto de referencia.
También incluyen los operadores bit a bit (-bAND, -bOR, -bXOR, -bNOT) para manipular los patrones de bits en valores.
Para obtener más información, consulte about_Comparison_Operators
Operadores logicos
Utilice operadores lógicos (-and, -or, -xor, -not,!) Para conectar declaraciones condicionales en un solo condicional complejo . Por ejemplo, puede usar un operador lógico y para crear un filtro de objeto con dos condiciones diferentes.
Para obtener más información, consulte about_Logical_Operators.