Compartir a través de


Windows PowerShell: Sintaxis de acceso directo

Normalmente hay muchas maneras de hacer lo mismo en Windows PowerShell. Encuentre aquella que funcione para usted y quédese con esa.

Don Jones

Una de las cosas que tanto amor y odio sobre Windows PowerShell es su flexibilidad inherente. En muchos sentidos, está escrito como un lenguaje de programación. Si no eres un programador, puede ignorar bastante y tratarlo como un shell de línea de comandos.

Bueno, quizás no completamente "ignorar." Verás, siempre parece que hay tres o cuatro maneras diferentes de hacer casi nada en Windows PowerShell. Sólo necesita conocer la manera de uno que hace más sentido para usted. Sin embargo, un usuario de Windows PowerShell inteligente, estará familiarizado con todos los medios necesarios realizar una tarea determinada. De este modo, cuando usted está buscando ejemplos escritos por otras personas, serás capaz de dar sentido a lo que está viendo.

Todo sobre el Alias

Los alias son el primer "atajo" encontrará la mayoría de ustedes. Tenga en cuenta este comando:

PS C:\> Get-WmiObject -class Win32_LogicalDisk -Filter "DriveType=3" | >> Where-Object -FilterScript{ $_.FreeSpace / $_.Size -lt .1 } | >> Select-Object -Property DeviceID,FreeSpace,Size >>

Puede contextual como así:

PS C:\>gwmi Win32_LogicalDisk -Fi "DriveType=3" | >> ?{ $_.FreeSpace / $_.Size -lt .1 } | >> SelectDeviceID,FreeSpace,Size >>

He usado alias en lugar de nombres de comando, y he truncado parámetros menos caracteres. Windows PowerShell permite truncar los nombres de parámetros como proporciona suficiente de cada nombre de parámetro para que se identifiquen. Esto hace menos escribir, pero un mando mucho más difícil de leer. Asesores de mis alumnos para deletrear todo cuando se está publicando un ejemplo, guardarlo en un script o lo contrario a lo que un artefacto permanente. Esto hará más fácil identificar más tarde.

En Windows PowerShell ISE y muchos otros editores, puede escribir la parte truncada del nombre del parámetro y pulse Tab para terminar de escribir el nombre completo. Hay menos escribir — y es más fácil de leer. Completamente he omitido los nombres de otros parámetros, porque son parámetros posicionales. En otras palabras, como recuerdo obtener todos los valores que se alinearon en el orden correcto, el comando aún funciona.

Una vez más, nombres truncados no son tan fáciles de leer. Mayoría de la gente comprenderá que está usando el nombre del parámetro completo en una secuencia de comandos. Utilizando los nombres de parámetro completo es en última instancia menos trabajo usted así, porque no tienes que recordar qué orden vienen en. Cuando utilice nombres, puede colocarlos en cualquier orden que desee.

Expresiones entre comillas

En ocasiones será necesario insertar un resultado de la expresión en una cadena entre comillas. Esto permite incluir ese resultado en la salida de la secuencia de comandos. Una forma de hacerlo es almacenar el resultado en una variable. A continuación, utilizar el truco de Windows PowerShell de insertar variables en cadenas entre comillas dobles. Windows PowerShell reemplazará la variable con su contenido:

$disk = Get-WmiObject -class Win32_LogicalDisk -filter "DeviceID='C:'" $freepercent = $disk.freespace / $disk.size * 100 Write-Host "Free space on drive C: at $freepercent percent"

Windows PowerShell también le permite colocar la expresión completa dentro de comillas dobles. La sintaxis se deriva de un truco de shell de Unix. Parece un poco raro, pero verá la gente utiliza mucho:

$disk = Get-WmiObject -class Win32_LogicalDisk -filter "DeviceID='C:'" Write-Host "Free space on drive C: at $($disk.freespace / $disk.size * 100) percent"

Prefiero el primer formulario, principalmente porque tiendo a trabajar principalmente con Windows PowerShell principiantes. La primera forma es un poco más fácil de leer. Una cosa sucede en cada paso de la secuencia de comandos, haciendo un poco más fácil seguir la lógica.

Windows PowerShell usa suficiente puntuación que la segunda forma parece más confusa. Sin embargo, la segunda forma también es técnicamente un poco más eficiente. Que no está creando una variable que Windows PowerShell tiene que realizar el seguimiento. También implica un wee poco menos escribiendo, que la mayoría de ustedes parece igual.

Creación de objetos

La forma larga nuevamente viene muy bien cuando lo necesito para crear un objeto personalizado:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $obj = New-Object -TypeNamePSObject $obj | Add-Member -MemberTypeNoteProperty -Name OSVersion -Value $os.version $obj | Add-Member -MemberTypeNoteProperty -Name Mfgr -Value $cs.manufacturer $obj | Add-Member -MemberTypeNoteProperty -Name Model -Value $cs.model Write-Output $obj

A veces voy contextual esto un poco con esta técnica, que combina los comandos Agregar miembros en una sola tubería:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $obj = New-Object -TypeNamePSObject $obj | Add-Member -MemberTypeNoteProperty -Name OSVersion -Value $os.version –PassThru | Add-Member -MemberTypeNoteProperty -Name Mfgr -Value $cs.manufacturer –PassThru | Add-Member -MemberTypeNoteProperty -Name Model -Value $cs.model –PassThru

He comenzado recientemente, conmutación a una técnica ligeramente diferente, que es incluso más legible:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $props = @{'OSVersion'= $os.version; 'Mfgr'=$cs.manufacturer; 'Model'=$cs.model} $obj = New-Object -TypeNamePSObject -Property $props Write-Output $obj

Una vez más, mi preferencia por este tipo de sintaxis de larga duración es debido a su legibilidad. Trabajo principalmente con recién llegados de Windows PowerShell, legibilidad es crucial para ayudarles a entender lo que está sucediendo. También verá la gente utilice este truco:

$obj = Select-Object OSVersion,Mfgr,Model $obj.OSVersion = $os.version $obj.Mfgr = $cs.manufacturer $obj.Model = $cs.model $obj

Los resultados son básicamente los mismos, y aquel último utiliza un poco menos escribir. Es tipo de un truco hacker utilizar Select Object forma. Está tomando ventaja del hecho de que puede decir Seleccionar objeto para seleccionar una propiedad inexistente. Realmente creará la propiedad con un valor vacío en el objeto de salida.

Realmente me duele ver seleccione objeto utilizado (o con mayor precisión, mal) ese camino ya no soy el único. Como en 2008, algunos de mis colegas Windows PowerShell MVP fueron hablar contra este uso. Independientemente de cómo te sientes acerca de esta técnica, debe aprender a reconocer lo que vas a saber lo que hace.

En Windows PowerShell versión 3, realmente serás capaz de hacer esto:

[pscustomobject]@{'OSVersion'= $os.version; 'Mfgr'=$cs.manufacturer; 'Model'=$cs.model}

No he decidido de lo que siento por esta sintaxis, pero en general está bien. Todavía es bastante legible y elimina un poco de escribir. Personas comenzará utilizando así, por lo que debe reconocerlo como lo que es. La última técnica también parece ejecutar más rápido (leer más sobre el Jonathan Medd del blog).

Métodos abreviados de objeto

La última técnica de acceso directo a menudo verá es similar a las expresiones de cadenas. Esto es totalmente legal sintaxis de programación — sólo puede resultar confuso para los recién llegados. Aún así, hay nada de "malo", por lo que debe acostumbrarse a verlo y saber lo que hace.

Digamos que queremos ejecutar algún método de un objeto y, a continuación, hacer algo con una de las propiedades del objeto resultante, así:

$string = ' Hello ' $string = $string.Trim() $string.Length

Todo lo que puede accesos directos mediante el uso de paréntesis. La expresión entre paréntesis se evalúa primero y Windows PowerShell básicamente reemplaza el paréntesis con su resultado:

$string = ' Hello ' ($string.Trim()).length

Posiciona la puntuación mucho, así que es un poco más difícil para su cerebro extraer las piezas aparte y determinar qué está pasando, pero es completamente legal. Incluso podría ejecutar un poquito más rápido, porque no tiene Windows PowerShell manipular la variable tantas veces.

Lo siento todos

En cierto modo, es lamentable Windows PowerShell no podía ofrecer sólo una forma de hacer nada. Entonces todos sólo tendríamos aprender una forma. Como sea, tenemos un shell que ofrece muchas variaciones de una sintaxis diferente para lo que es esencialmente la misma tarea. Paga al menos estar familiarizado con las muchas alternativas de sintaxis. De este modo, se pueden hacer uso de cualquier ejemplos te encuentro.

Raymond Chen

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.

Contenido relacionado