Windows PowerShell Filtrar por un lado, dar formato por otro
Don Jones
Contents
Filtrar izquierda, en el origen
Dar formato a la derecha, y está listo con IT
De forma subyacente
En la lista distribución de Windows PowerShell MVP Most Valuable Professional (), hemos recientemente ha explicar y intentar documento, Windows PowerShell “ trampas. ” Sabe lo que queremos decir: esas pequeñas cosas que don’t funcionan exactamente piensa harían, y que realmente puede causar problemas cuando aprendizaje el shell.
Dos de las trampas mayores implican filtrado y formato. He mencionado en la lista que he intentado ayuda gente evitar problemas en las áreas por recordar para "filtrar a la izquierda, derecha formato." Me ocurrió que la frase puede ser una buena base para una columna de uso más eficaz de Windows PowerShell, por lo tanto, aquí estamos.
Filtrar izquierda, en el origen
Uso libres Active Directory (AD) administración cmdlets de Quest (puede encontrarlos en quest.com/powershell) animar un lote y a utilizarlas, demasiado. Se ha diseñado un cmdlet, Get-QADUser para recuperar usuarios desde Active Directory. No es raro que vean las personas que ejecutar un comando como éste:
Get-QADUser | Where-Object { $_.Department -eq "Sales" } | Set-QADUser -department "Inside Sales"
Esto podría cambiar todos los usuarios cuyo atributo de departamento de AD se establece a ventas, para que el atributo se establece en ventas en su lugar. El problema es que el filtrado está ocurriendo. El primer cmdlet, Get-QADUser, va a recuperar todos los usuarios de todo el dominio.
Afortunadamente, no recuperará todos los atributos de cada usuario de forma predeterminada, sino en un dominio grande, lo hará más que suficiente daños como controlador de dominio bajo luchas (DC) para transmitir información de cuenta de usuario para el equipo cliente. El cliente, a continuación, debe examinar cada cuenta, uno en uno y descartarlos que no tienen un atributo de departamento que contiene el valor ventas. ¿Qué pérdida!
Por eso me gusta "filtro izquierda". Siempre mover criterios de filtrado como mucho a la izquierda de la línea de comandos como possible.In este caso, el cmdlet Get-QADUser sí ocurre que admite el filtrado:
Get-QADUser -Department "Sales" | Set-QADUser -department "Inside Sales"
Ya no es necesario para el cmdlet Where-Object. Mejor aún, utilizando esta sintaxis, Get-QADUser es transmitir los criterios de filtro para el controlador de dominio y el controlador de dominio es recuperar y sólo las transmitir cuentas que coincidan con este criterio. Los controladores de dominio son fantásticas en filtrado, lo hacen todo el día, realmente, por lo que se va a colocar el filtrado en el mejor lugar posible para la ejecución rápida. El cliente no tiene que tratar con tantos objetos procedentes de DC, por lo que el comando se ejecutará más rápido y más eficaz.
Éste es otro ejemplo, mediante Instrumental de administración de Windows (WMI):
Get-WmiObject CIM_DataFile -computerName Server2 | Where { $_.FileName -like "*.dll" }
Esto se póngase en contacto con WMI en Server2, obtener todas las instancias de la clase CIM_DataFile, que representa los archivos en la unidad de disco duro y aquellos que no son archivos DLL de filtro. Por lo tanto, está izquierda con una lista de los archivos DLL de ese servidor. Pero esto va a tardar tiempo en ejecutarse, está poner toda información de archivo del servidor a través de al equipo. De nuevo, ayuda a mover filtrado adicional de la izquierda y, en este caso, es posible hacerlo:
Get-WmiObject CIM_DataFile -computerName Server2 -filter "FileName LIKE '*.dll'"
Deberá utilizar la sintaxis de filtro ligeramente diferente porque no se ejecuta esta sintaxis por Windows PowerShell. En su lugar, se transmiten a WMI en el equipo remoto. Se sigue tomar tiempo en ejecutarse, pero implicará menos tráfico de red y, finalmente, menos sobrecarga en Server2 y su equipo. Acostumbrarse a leer los cmdletsarchivos (Ayuda Get-WmiObject, en este caso) de ayuda para ver qué opciones de filtrado ofrece un cmdlet. Sólo se basan en Where-Object cuando Get-* cmdlet que utilizas no admite el filtrado que necesita.
Dar formato a la derecha, y está listo con IT
El otro gotcha se relaciona con el formato de * cmdlets, como Format-Table y Format-List. Verá nuevos ejecutar algo así:
Get-Process | Format-Table ID,VM,Name | Export-CSV c:\processes.csv
No funcionará. AH, se ejecutará pero no gusta los resultados. Y si un segundo realmente leer ese comando, quizá se pregunte exactamente lo esperaba que sucediera todos modos. ¿Ha llegado un montón de procesos, formato a una tabla, y a continuación, desea alguna forma la tabla para convertirse en un archivo .csv? Si el objetivo final es obtener un archivo .csv que sólo contiene algunas propiedades de objeto, ejecutaría este:
Get-Process | Select-Object ID,VM,Name | Export-CSV c:\processes.csv
Si el objetivo es obtener una tabla con formato, en columnas en un archivo de texto, lo haría esto:
Get-Process | Format-Table ID,VM,Name | Out-File c:\processes.txt
Pero no puede mezclar coincidan con estos dos enfoques. Descripción de por qué eso lo requiere algunos información sobre cómo funcionan los cmdlets de formato, junto con cómo out-* trabajo cmdlets.
La canalización de Windows PowerShell, que es lo que ejecutan los comandos en - es rígida para finalizar en el Out-Default cmdlet. Este cmdlet realiza poco más de objetos para la redirección Out-Host, que es responsable de mostrar el resultado en la pantalla.
Cualquier línea de comandos, o canalización, para utilizar el término correcto, que no termina en una salida-* cmdlet, de forma predeterminada, terminará en Out-Default, que es igual a decir termina en Out-Host. El truco es que out-* cmdlets no sabe qué hacer con objetos, que necesitan esos objetos convertidos en instrucciones de formato. Por lo tanto, cuando Out-Host obtiene objetos de proceso, envía esos objetos a uno de formato-* cmdlets. Cuál se utiliza, Table, Wide, personalizada o lista, se basa en un conjunto de reglas que no poder tratar de esta columna. Pero envía los objetos para uno de ellos y el formato-* cmdlet toma los objetos y genera instrucciones de formato. Salida-* cmdlets saber cómo utilizarlas instrucciones de formato y las utilice para crear cualquier presentación es necesario.
Así que vamos a colocarla en términos prácticos: Hay tres o cuatro principal fuera-* cmdlets que se va a encontrar y utilizar periódicamente: Out-Host, Out-File, Out-Printer y Out-String.
Éstos están diseñadas para consumir sólo instrucciones de formato y llevar a cabo las instrucciones para construir una pantalla, un archivo de texto, una página de la impresora o una cadena, respectivamente. La única forma de obtenerlas instrucciones de formato es ejecutar objetos a través de un formato de * cmdlet, y instrucciones de formato son lo único que el formato-* generar cmdlets. Así, cuando se ejecuta este:
Get-Process | Format-Table ID,VM,Name |Export-CSV c:\processes.csv
¿Qué pasa en el archivo .csv está las instrucciones de formato producidas por Format-Table, probablemente en absoluto lo que esperaba. Después de ejecutar formato-* cmdlet, los objetos originales se pierden y se deja con instrucciones de formato. Ésta es otra regla sencilla para: Formato a la derecha. Insertar en otras palabras, el cmdlet de formato en el extremo derecho de la línea de comandos. Lo único que puede provenir después formato-* cmdlet es un retorno de carro o una salida-* cmdlet. Eso es legal:
Get-Process | Format-Table ID,VM,Name | Out-File c:\processes.txt
Out-File sabe cómo leer las instrucciones de formato y utilizarlas para crear un archivo de texto. También es válida:
Get-Process | Format-Table ID,VM,Name
Aquí, está depender el Out-Default rígida, que redirige a Out-Host, que sabe cómo consumir instrucciones de formato y crear una presentación de texto en la ventana host o la consola. Mantener el formato como mucho a la derecha como sea posible, seguida por nada o salida-* cmdlet y estará bien.
Una sugerencia más: Debe seguir nada fuera-* cmdlet porque, con sólo una excepción, ninguno de ellos emitir objetos a la canalización. De no tiene sentido tener nada siga una salida-* cmdlet, ya que nada procederá de ella.
De forma subyacente
Espero que ha ayudado a comprender por qué estos problemas son la forma están. Pero, como mínimo, recuerde "filtro izquierda, formato derecha"y deben poder permanecer fuera de los problemas evitando las trampas completamente.
Muchos peculiaridades poco de Windows PowerShell resulta más fáciles entender una vez que realmente comprenda cómo y por qué el shell funciona del modo lo hace. Dedicar tiempo a aprender lo que sucede en realidad y aplicar esos conocimientos, siempre que se está obteniendo resultados inesperados en el shell, rápidamente hará que un gurú de Windows PowerShell.
Don Jones es uno de la nación formadores más experimentados de Windows PowerShell y escritores. Blogs semanal Windows PowerShell sugerencias en ConcentratedTech.com; también puede ponerse en contacto con él o preguntas le existe.