Windows PowerShell: Una sintaxis nueva en la shell
Algunos comandos con una sintaxis nueva en la versión 3 de Windows PowerShell nos permiten escribir comandos que se pueden leer más fácilmente pero que son un poco limitados.
Don Jones
Una de las nuevas características de Windows PowerShell versión 3 es una nueva forma de sintaxis para los cmdlets donde-objeto y objeto de ForEach. Ambos de estos cmdlets normalmente aceptan un scriptblock (en el caso de objetos donde, se llama filterscript, porque debe devolver $True o False $).
Dentro de ese scriptblock, utiliza el símbolo de marcador de posición de $_ para representar "lo que era corriente en para el cmdlet." Aquí está un ejemplo utilizando ambos cmdlets (esto no es un comando reales sensato, pero muestra el uso de los cmdlets):
Get-WmiObject –class Win32_LogicalDisk | Where-Object –filterscript{ $_.DriveType –eq 3 } | ForEach-Object –process { $_.ChkDsk() }
Nunca verá estos comandos escritos de esta manera. Personas tienden a usar alias, nombres de parámetro truncado y parámetros posicionales para guardar escribiendo. No inusual:
gwmi Win32_LogicalDisk | ? { $_.DriveType –eq 3 } | % { $_.ChkDsk() }
¿Hay nada como un poco de sintaxis Arcana para garantizar la seguridad de trabajo, derecho? Nueva sintaxis del objeto donde le permite hacer esto:
gwmi Win32_LogicalDisk | where DriveType –eq 3 | % { $_.ChkDsk() }
Aviso que cambié a un alias diferente para el cmdlet. ¿Todavía puede utilizar? Si quieres, pero me impulsa loco. ¿Vengo de un fondo de tiempo básico, donde? fue un método abreviado para la instrucción Print. ¿Lectura? en un Windows PowerShell comando lastima mi cerebro. También he prescindir de las llaves y el símbolo de $_.
Esencialmente, objeto de donde ahora tiene un parámetro posicional a aceptar la propiedad que desea filtrar (DriveType, en mi ejemplo). Define los principales operadores de Windows PowerShell (- eq, - ne, - como - gt, etc.) como parámetros. El valor de este parámetro es el valor que desea filtrar (aquí, el valor es 3). Esta forma abreviada es más fácil de leer, pero sólo se puede utilizar para una sola comparación. Por ejemplo, a la siguiente no es una declaración legal:
Gwmi Win32_Service | Where StartMode –eq 'Auto' –and State –ne 'Running'
Para ello, tendrás que volver a la sintaxis de la vieja escuela:
Gwmi Win32_Service | Where { $_.StartMode –eq 'Auto' –and $_.State –ne 'Running' }
Objeto de ForEach obtiene una forma de sintaxis similar puntuación reducida:
gwmi Win32_LogicalDisk | where DriveType –eq 3 | foreachChkDsk()
Una vez más, he decidió el alias de ForEach en lugar de % para hacerlo más fácil de leer. Podría continuar utilizando % si así lo desea. Uno de mis colegas MVPs escribieron un artículo gran blog acerca de estas formas, y merece una lectura. Asimismo, introduce $PSItem, que parece ser una alternativa para el símbolo de _ $ a menudo incomprendido.
Personalmente, he sentimientos acerca de estas nuevas formas de sintaxis. Por un lado, son definitivamente más fácil para un recién llegado a comprender. Eliminar las llaves y el siempre confuso $_ es genial. Por otro lado, estas nuevas formas no son totalmente funcionales. Sólo pueden hacer una comparación única. Aún necesitará aprender la sintaxis antigua.
Además, hay más de seis años de sintaxis de estilo antiguo flotando en popular blogs, artículos de revistas y libros. Todavía vas a necesita conocer la sintaxis antigua para dar sentido a esos ejemplos.
Así que esta nueva sintaxis no elimina la necesidad de conocer la sintaxis antigua. Sólo significa que tiene dos formas de recordar en lugar de uno. Sin embargo, es lo que tenemos que trabajar, por lo es la manera que trabajaremos.
Don Jones es un premio de MVP de Microsoft y autor de "Aprender Windows PowerShell en un mes de comidas" (publicaciones de Manning, 2011), un libro diseñado para ayudar a cualquier administrador efectivizada con Windows PowerShell. Jones también ofrece formación de Windows PowerShell in situ y pública. Contacto con él a través de ConcentratedTech.com o bit.ly/AskDon.