2011-10-17 14 views

Respuesta

5

Powershell ya tiene una sintaxis bastante limpia, por lo que no hay mucho que deba mejorarse.

Una nueva adición que me gusta es el Hash Table as objects, donde se puede crear objetos pasando hastable con sus propiedades:

[<ClassName>]$Variable = @{<Property>=<Value>;<Property>=<Value>} 

Así que la forma más nueva, más sucinta de la creación de objetos personalizados es:

$obj = [PSCustomObject]@{a=1; b=2; c=3; d=4} 

Se ha mejorado la redirección. Que tiene ahora corrientes de verbosa, depurar y señalización, además a la normalidad (tubería) y el error y lo que puede hacer redirecciones como 5>&1

Puede utilizar variables $PSDefaultParameterValues preferencia para establecer los valores de los parámetros por defecto para los cmdlets.

No es el nuevo [ordered] acelerador para crear hastable ordenado (diccionario):

$a = [ordered]@{a=1;b=2;d=3;c=4} 

De otra respuesta aquí en SO, me di cuenta de que era nuevo en -in Powershell v3.0:

Así que

hacer algo como 1 -in 1,2,3. Anteriormente sólo teníamos -contains

Cmdlets:

Puede actualizar ayuda con Update-Help cmdlet. Hay cmdlets relacionados con la web como Invoke- WebRequest. También puede manejar JSON usando los cmdlets ConverTo-JSON y ConvertFrom-JSON.

+0

"ordenado hastable (diccionario)": pensé 'diccionario' y 'tabla hash' eran sinónimo. Tal vez me estoy confundiendo con los dictados de Python, pero los diccionarios no imponen orden, ¿verdad? ¿Puedes aclarar eso? –

7

He aquí un ejemplo:

dir | where length -lt 10

Antes de 3.0, que habría sido

dir | where {$_.length -lt 10}

edición: otro ejemplo, esta vez con foreach a objetos

dir | foreach-object length

+0

+1 - Ni siquiera me di cuenta de esto antes. – manojlds

+0

Estoy de acuerdo con el remitente. Esto es algo sobre lo que esperaba ver algunas publicaciones, porque hace que las secuencias de comandos sean un poco más fáciles de leer. Aunque no creo que me guste. –

9

Algunos de los cmdlets *-Object comunes utilizan conjuntos de parámetros múltiples para lograr la sintaxis simplificada. Echar un vistazo a esto en V3:

C:\PS> Get-Command Where-Object -Syntax 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] [-EQ] [<CommonParameters>] 

Where-Object [-FilterScript] <scriptblock> [-InputObject <psobject>] [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CGT [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNE [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -LT [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CEQ [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NE [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -GT [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CLT [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -GE [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CGE [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -LE [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CLE [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -Like [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CLike [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NotLike [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNotLike [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -Match [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CMatch [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NotMatch [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNotMatch [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -Contains [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CContains [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NotContains [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNotContains [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -In [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CIn [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NotIn [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNotIn [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -Is [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -IsNot [<CommonParameters>] 

NOTA: Salida los nuevos operadores -NotIn y -In por ejemplo:

C:\PS> 1 -In 1..5 
C:\PS> 10 -NotIn 1..5 

Así que la sintaxis simplificada es agradable para el caso "común", pero cuidado con lo puedes caer fácilmente en las rocas afiladas y la lava, por ejemplo:

C:\PS> Get-ChildItem | Where LastWriteTime.Year -eq 2010 

Esto devuelve nada y lo que es peor, no hay error por lo que cree que el conjunto de resultados es "correcta" vacío cuando, de hecho, esta sintaxis simplemente no funciona como se podría esperar. Es decir, no puede acceder a una propiedad de una propiedad. En lo anterior, PowerShell busca una propiedad llamada LastWriteTime.Year que no existe.

También tenga en cuenta que, como parte de la sintaxis simplificada ahora se puede utilizar en lugar del $PSItem$_ en caso de que o los que se escribe guiones para tener algún tipo de reacción alérgica a $_. :-)

Y si bien esto no es necesariamente ligada a la sintaxis simplificada encuentro que simplifica mi vida y lo amo:

C:\PS> Get-ChildItem -Directory 
C:\PS> Get-ChildItem -File 
C:\PS> dir -ad 
C:\PS> Get-ChildItem -Attributes System+Hidden+Directory+!Archive 
+0

+1 para '$ PSItem'. Por cierto, ¿cómo puedes saber sobre estas cosas? ¿Está todo documentado? – manojlds

+1

Sí, no me gusto la sintaxis simplificada con el lugar donde etc ... más problemas que ganar creo. – manojlds

+1

Estoy un poco preocupado por la sintaxis simplificada. Entiendo el deseo de hacer que sea más fácil para los administradores para llegar a PowerShell, pero no estoy seguro de que esto es algo más que un cebo y 'switch'. El tiempo dirá, supongo. En cuanto a enterarse de estas cosas, ser un MVP tiene sus privilegios. :-) En serio, la interacción entre el equipo de PowerShell y sus MVP ha sido muy buena desde que empezaron a adjudicar los MVP de PowerShell en el 2006. ' –

Cuestiones relacionadas