El Blog de Gualtrysoft

Windows 2000/2003/2008, Active Directory, VBScript, Hyper-V, PowerShell y todo aquello interesante a la hora de usar, configurar y administrar Windows Server. También tenemos longanizas…

PowerShell Tip: Saber El Valor Predeterminado De los Parámetros De Un Cmdlet

Posted by urpiano en Miércoles 28 \28\UTC noviembre \28\UTC 2012

Si queremos mirar con la ayuda de un Cmdlet los valores por defecto de sus parámetros, esto lo podemos realizar ejecutando Get-Help -full o, más específicamente, Get-Help -Property * | Format-Table Name,DefaultValue.

Veamos como ejemplo el Cmdlet ConvertTo-CSV:

PS C:\> Get-Help ConvertTo-Csv -Parameter * | Format-Table Name,Defaultvalue
name                                                        defaultValue
----                                                        ------------
Delimiter                                                   , (coma)
InputObject
NoTypeInformation
UseCulture                                                  Coma

Como podemos ver, el parámetro Delimiter tiene valor predeterminado (“,”), así como el parámetro UseCulture (“Coma”).

Esto es así…, pero no en todos los casos. No todos los Cmdlets brindan en la ayuda esa información, cosa por otra parte explicable en determinados casos, ya que estos valores predeterminados pueden ser calculados vía script y por tanto ser muy incómodos de comprender y/o representar. Por ejemplo el Cmdlet Test-Path no suministra esta información:

PS P:\> Get-Help Test-Path -Parameter * | Format-Table Name,Defaultvalue

name                                                        defaultValue
----                                                        ------------
Credential
Exclude
Filter
Include
IsValid
LiteralPath
Path
PathType
UseTransaction

Como podemos ver, ni uno de los parámetros muestra el valor predeterminado (aunque si hemos mirado en Technet la ayuda de este Cmdlet vemos cómo sí que los pone). Así pues ¿cómo podemos saber los valores predeterminados de los parámetros de este Cmdlet desde el propio PowerShell? ¡.NET viene al rescate! Los Cmdelts de PowerShell tienen una clase que los implementa en el Framework de .NET. Es más, podemos averiguar cuál es esta clase, ya que todo Cmdlet tiene la propiedad ImplementingType cuyo valor es el nombre completo de la clase .NET que lo implementa; si ejecutamos:

PS P:\> (Get-Command Test-Path).ImplementingType
Microsoft.PowerShell.Commands.TestPathCommand

Vale, pues ya sabemos la clase, ahora podemos usar New-Object para obtener las propiedades de la clase y su valor predeterminado. Esto lo realizamos de la siguiente manera:

PS P:\> New-Object Microsoft.PowerShell.Commands.TestPathCommand


Path                  :
LiteralPath           :
Filter                :
Include               : {}
Exclude               : {}
PathType              : Any
IsValid               : False
Credential            :
Force                 : False
SupportsShouldProcess : True
ParameterSetName      :
MyInvocation          : System.Management.Automation.InvocationInfo
InvokeCommand         : System.Management.Automation.CommandInvocationIntrinsics
Host                  :
SessionState          :
Events                :
JobRepository         :
InvokeProvider        :
Stopping              : False
CommandRuntime        :
CurrentPSTransaction  :
CommandOrigin         : Internal

Como podemos ver, la propiedad IsValid tiene de valor predeterminado False, cosa que antes no podíamos saber, así como PathType tiene como valor predeterminado Any y esa información tampoco nos la suministró Get-Help.

Otro ejemplo ¿Cuál es el espacio de nombres WMI predeterminado para Get-WmiObject? Si ejecutamos:

PS P:\> Get-Help Get-WmiObject -Parameter Namespace

-Namespace <string>
    Si se usa con el parámetro Class, este parámetro especifica el espacio de nombres
    del repositorio de WMI donde se encuentra la clase de WMI a la que se hace referencia. Si se usa
    con el parámetro List, especifica el espacio de nombres desde el que se recopilará
    información sobre la clase de WMI.

    ¿Requerido?                  false
    ¿Posición?                   named
    Valor predeterminado
    ¿Aceptar canalización?       false
    ¿Aceptar caracteres comodín? false

Como podemos ver, la ayuda no nos indica cuál es el espacio de nombres, sin embargo, dado el comportamiento de Get-WmiObject, está claro que algún espacio de nombres predeterminado debe tener, pues se le puede pasar un nombre de clase sin especificar el espacio de nombres al que pertenece y devuelve las intancias de la clase (siempre que sea una clase del espacio de nombres predeterminado, que todos nos imaginamos cuál es ¿verdad?). Si ejecutamos lo que pongo a continuación podremos ratificar cuál es el espacio de nombres predeterminado de Get-WmiObject:

PS P:\> (New-Object (Get-Command Get-WmiObject).ImplementingType).Namespace
root\cimv2

Es decir, que el espacio de nombres predeterminado de Get-WmiObject es, tal y como nos habíamos imaginado, root\cimv2.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: