Parámetros comunes (opciones para cmdlets)

Los parámetros comunes son un conjunto de parámetros de cmdlet que se pueden utilizar con cualquier cmdlet. Los implementa Windows PowerShell y no el programador del cmdlet. Están disponibles automáticamente para cualquier cmdlet. Los parámetros comunes se pueden utilizar con cualquier cmdlet, pero puede que no surtan efecto en todos ellos. Por ejemplo, si un cmdlet no genera ninguna salida detallada, utilizar el parámetro común Verbose no tendrá ningún efecto. Varios parámetros comunes invalidan valores predeterminados del sistema o preferencias establecidas mediante las variables de preferencia de Windows PowerShell. A diferencia de las variables de preferencia, los parámetros comunes afectan solamente a los comandos en los que se utilizan. Además de los parámetros comunes, muchos cmdlets proporcionan los parámetros de mitigación de riesgos WhatIf y Confirm. Los cmdlets que implican riesgos para el sistema o los datos del usuario suelen proporcionar estos parámetros.

Los parámetros comunes son:

  1. -Verbose - Provee más detalles.
  2. -Debug - Provee información de depuración.
  3. -WarningAction - Determina cómo responde el cmdlet a una advertencia procedente del comando.
  4. -WarningVariable - Almacena las advertencias sobre el comando en la variable especificada.
  5. -ErrorAction - Instruye al cmdlet para realizar una acción cuando ocurren errores. Las acciones pueden ser: continue, stop, silently continue, e inquire.
  6. -ErrorVariable - Usa una variable específica para guardar información del error. Esto es en adición a la variable estándar $error.
  7. -OutVariable - Variable usada para guardar información de salida.
  8. -OutBuffer - Acumula cierto número de objetos antes de enviarlos a través de la canalización.

  9. Los parámetros de mitigación de riesgos son:
  10. -WhatIf – El cmdlet no es verdaderamente ejecutado, provee información sobre “que pasaría” si fuera ejecutado.
  11. -Confirm - Pregunta al usuario antes de ejecutar el cmdlet.

Para ver más información sobre parámetros comunes escriba lo siguiente en la consola de PS:

 get-help about_commonparameters<enter>

Para ver los parámetros (comunes y no comunes) disponibles para un cmdlet, en nuestro caso el cmdlet "Set-ExecutionPolicy", escriba

Set-ExecutionPolicy -<tab>

Puede desplazarse a través de los parámetros disponibles para un cmdlet, continuamente presionando la tecla “tab”. Asegúrese de haber escrito el guión “-” antes de presionar tab. Use el cmdlet "Get-Help" para conocer la información de los parámetros disponibles en un cmdlet. Continuando con el cmdlet "Set-ExectutionPolicy", consigamos la ayuda:

 
Get-Help Set-ExecutionPolicy -Full<enter>
 

Usando el parámeto -Full, obtenemos la información completa, dividida en diferentes secciones. En la sección "Parametros" (dónde conseguimos la información de los parámetros disponibles para el cmdlet), hay una lista de los parámetros comunes que soporta el cmdlet. Ejemplos: 1. En este ejemplo, usaremos el parámetro -whatif para ver “que ocurririá” si usáramos el cmdlet "Set-ExecutionPolicy":

 Set-ExecutionPolicy Unrestricted -whatif<enter>

El cmdlet responde: Se está realizando la operación "Set-ExecutionPolicy" en el destino "Unrestricted". Antes de hacer cualquier cambio, puede verificar que el cmdlet va a hacer lo que se espera. 2. Usando el mismo cmdlet, elegimos el parámetro "-confirm" que pregunta antes de ejecutar:

 
Set-ExecutionPolicy Unrestricted -confirm<enter>
 

El cmdlet responde asi: Confirmar ¿Está seguro de que desea realizar esta acción? •[S] Sí (El valor por defecto es “S”) •[O] Si a Todo •[N] No •[T] No a Todo •[U] Suspender •[?] Ayuda

¿Suspender? Esta opción es muy útil. Digamos que usted no está seguro de querer ejecutar el cmdlet debido a que no está seguro del valor actual que tiene “ExecutionPolicy” . Puede verificar el valor de “ExecutionPolicy” antes de realizar el cambio, como se ve en el código de abajo:
Set-ExecutionPolicy Unrestricted -confirm
Confirmar
¿Está seguro de que desea ...
S<enter> 
(Esto activa el modo de Suspención, demostrado en el prompt por “>>”).
>>Get-ExecutionPolicy<enter>
 Resricted (u otro valor que tenga establecida la política).
>>exit<enter> (Escribiendo “exit” sale del modo de 
suspención y regresa al comando original)
¿Esta seguro de que desea ... 
S<enter> (Confirma la ejecución del cmdlet 
“Set-ExecutionPolicy Unrestricted” y establece 
la política de ejecución a “Unrestricted”).

Hemos visto unos pocos ejemplos de lo que usted puede hacer con el uso de los parámetros. Como ya sabe cómo llamar a “Get-Help” para un cmdlet específico, es muy fácil descubrir que parámetros están disponibles para un cmdlet. Haga toda la experimentación y exploración que necesite para sentirse seguro en este tema, antes de continuar con el siguiente tema: “Objetos”.

Introducción a los objetos

Como vimos en el artículo anterior Introducción a PowerShell, PowerShell está basado en objetos, y no basado en texto. Dado que estamos trabajando con objetos, existe más información que lo que se presenta (por defecto) en la línea de comandos. Esa información puede no ser visible inicialmente, pero mediante el uso de cmdlets, parámetros, y bloques de secuencias de comandos, podemos interactuar con un objeto para que nos proporcione la información que requerimos.

¿Qué es un Objeto?

Un “Objeto” es algo desde donde podemos conseguir información y/o sobre donde realizar una acción. Un objeto, en PowerShell, consiste en propiedades (información que podemos conseguir) y métodos (acciones que podemos realizar). Como ejemplo, echemos un vistazo a un "televisor". El objeto es obvio, se trata de un aparato para ver televisión. Las propiedades de un televisor podrían ser: la marca, el tamaño de la pantalla y el tipo (antiguo, plasma, LCD o LED). Los métodos son las acciones que podemos realizar en el objeto, tales como: encenderlo, apagarlo, sintonizar un canal, etc... Bastante simple, verdad? Ahora veamos las propiedades y los métodos de un objeto PS. El cmdlet "Get-Member" es usado para examinar que propiedades y métodos tiene un objeto particular.
Ejemplo 1. Propiedades y métodos del cmdlet "Get-Service" Escriba lo siguiente para ver las propiedades y métodos del cmdlet "Get-Service". En este ejemplo, la salida del cmdlet "Get-Service" (que es un objeto) se canaliza en el cmdlet "Get-Member".

Get-Service | Get-Member <enter>
Figura 1 - Resultados del cmdlet Get-Member para el cmdlet Get-Service.

Como vemos en la figura 1, hemos identificado que propiedades y métodos están disponibles en el cmdlet “Get-Service”. Si no está familiarizado con lo que se devuelve en la columna "Definition", piense que esta viendo los "Tipos de Datos". Por ejemplo, la propiedad “CanStop” devuelve un tipo Boolean. Por ahora piense en un tipo Booleano como aquel que sólo puede tomar dos valores: Verdadero (“True”) o Falso (“False”).
No se preocupe demasiado por esto ahora, ya que estaremos cubriendo “Tipos” en otro artículo de PowerShell. Sólo hagase una idea de que el cmdlet “Get-Member” también devuelve “tipos de datos” en la columna Definition.

Ejemplo 2. Consiguiendo las propiedades del cmdlet “Get-Service”. En este ejemplo, refinaremos nuestra búsqueda, para sólo mostrar las propiedades, usando el parámetro -MemberType:
 
Get-Service | Get-Member -MemberType Property<enter>

Ejemplo 3. Consiguiendo los métodos del cmdlet “Get-Service”. Usamos casi la misma línea de comando que en el ejercicio anterior, excepto que al parámetro -MemberType, esta vez, en lugar de Properties le pasamos Method:
Get-Service | Get-Member -MemberType Method<enter>
Es importante que se de cuenta de la importancia de manejar bien los objetos, ya que todo en Windows PowerShell es un objeto. Veamos un ejemplo: Supongamos que quiere saber todos los archivos que se crearon en el último día en el disco C:\ (suponiendo que el día de la fecha es el 25/03/2012) Simplemente ejecuta el siguiente comando:
Get-ChildItem -Path C:\ -Recurse | Where-Object 
         {$_.LastWriteTime -gt "03/25/2012"}<enter>
Examinemos que hace este comando:
  1. Llamamos el cmdlet “Get-ChildItem” porque queremos enumerar el sistema de archivos.
  2. El parámetro "-Path" apunta a la raíz del disco C:\ como punto inicial. El parámetro "-Recurse" significa que queremos enumerar todos los subdirectorios y archivos
  3. El objeto devuelto por el cmdlet "Get-ChildItem" se canaliza en un bloque de script, con el caracter de canalización ("|").
  4. Where-Object es una sentencia de bucle que encuentra cada objeto que coincide con el criterio que estamos buscando ({$_.LastWriteTime -gt “03/25/2012″}).
LastWriteTime es una propiedad del cmdlet Get-ChildItem del tipo DateTime, como podemos ver si ejecutamos el siguiente cmdlet:
 Get-ChildItem | Get-Member -MemberType Property
La salida se ve en la figura 2:
Figura 2 - Propiedades del cmdlet Get-ChildItem.
-gt” es un operador que significa mayor que (greater than). En un artículo posterior estaremos hablando de los operadores existentes en PowerShell. En definitiva con el criterio {$_.LastWriteTime -gt “03/25/2012″}, estamos buscando todoslos objetos (archivos y carpetas) que hayan sido modificados desde el 25 de marzo de 2012.
Note que la sintaxis $_ hace referencia al objeto que se está evaluando, por lo que $_.LastWriteTime, estará evaluando sólo la propiedad LastWriteTime de ese objeto.

Para finalizar este largo artículo estaremos viendo a continuación como formatear la salida en PowerShell.

Formateo de la salida

Cuando ejecutamos un cmdlet estamos confiando en PowerShell para mostrar los resultados. El cmdlet “Format-” nos permite elegir el formato para mostrar los resultados. Para obtener una lista de opciones de formato, escriba el siguiente comando:
 Get-Command Format-* <enter>
La salida se ve en la figura 3:
Figura 3 - Lista de opciones de formato

Format-Table

El cmdlet “Format-Table” muestra datos en filas y columnas, similar a lo que vería en una hoja de cálculo de Excel. Por defecto, PowerShell trata de formatear la vista, pero no siempre muestra los mejores resultados. Por ejemplo, formateemos la salida del cmdlet “Get-ChildItem” para el directorio “C:\Windows”:
Get-ChildItem C:\Windows | Format-Table<enter>
Si queremos que haya menos espacio entre las columnas, Format-Table admite el parámetro "-AutoSize" que elimina los espacios en blanco extras que provee la salida por defecto.
Get-ChildItem C:\Windows | Format-Table -AutoSize<enter>
En la figura 4 vemos las salidas de cada uno de los comandos anteriores:
Figura 4- Arriba vemos la salida del cmdlet Get-ChildItem C:\Windows | Format-Table, nientras que abajo la salida de Get-ChildItem C:\Windows | Format-Table -AutoSize, vemos que en el segundo caso se han reducido las distancias entre las columnas

Como vimos anteriormente, puede usar la tecla <tab> para deslizarse a través de todos los parámetros disponibles para el cmdlet “Format-table”. Experimente con cada parámetro para ver como se manipula el formateo.

Format-List

El cmdlet “Format-List” nuestra la información en forma de lista, como se desprende de su nombre:
 
Get-ChildItem C:\Windows | Format-List<enter>
Por defecto, devuelve las siguientes propiedades: Name, CreationTime, LastWriteTime, and LastAccessTime. Si queremos la ruta completa de los archivos, podemos usar el parámetro -Property para listar la propiedad “FullName”:
 
Get-ChildItem C:\Windows | Format-List -Property FullName<enter>
Pero suponga que ahora quiere, no solo la ruta completa de los archivos y subdirectorios, sino también, fecha de creación, y la última hora que el archivo fue modificado. Para enumerar múltiples propiedades, solamente sepre cada propiedad con una coma (,) como se muestra en este ejemplo:
 
 Get-ChildItem C:\Windows | Format-List 
          -Property FullName,CreationTime,LastWriteTime<enter>

Nota: Puede también usar el parámetro -Property con el cmdlet “Format-Table” para construir tablas, con cada propiedad como un encabezado. Ver Figura 5.

Figura 5- Salida en formato de tabla donde hemos seleccionado las columnas a presentar a traves del parámetro -Property

Format-Wide

El cmdlet “Format-Wide comprime los resultados de una lista, para ajustarse a la pantalla:
Get-ChildItem C: | Format-Wide<enter>
Los resultados son presentados en un formato de lista ordenados por columna, similar al viejo comando “dir /D”. Puede personalizar el número de columnas usando el parámetro numérico -Column:
 
Get-ChildItem C: | Format-Wide -Column 3<enter>

Group-Object El cmdlet “Group-Object” nos permite formatear la información de salida basada en grupos. Por ejemplo, hay una propiedad llamada “Company” para el objeto devuelto por el cmdlet “Get-Process”. Asignemos la propiedad “Company” a un grupo:
 
Get-Process | Group-Object Company<enter>
La salida agrupa la información como sigue: •Name – Nombre suministrado por la propiedad Company del objeto Get-Process. •Count – El número de procesos corriendo de cada compañía. •Group – Una lista truncada de los procesos corriendo. Veamos otro ejemplo de cómo usar el cmdlet “Group-Object”. Supongamos que queremos saber que Id de eventos (Event ID) están presentes en el system log:
 
Get-EventLog System | Group-Object eventid<enter>
Nota: La columna Name es el Event ID, aunque no está marcado como tal. El cmdlet "Group-Object", por defecto, pone la propiedad que se especifique, en la columna "Nombre". Ver figura 6

Figura 6- El cmdlet "Group-Object", por defecto, pone la propiedad especificada (en nuestro caso eventid), en la columna "Nombre".

Sort-Object

En el ejemplo anterior, vemos una columna “Count”. Ella indica el núnero de ocurrencias de cada Event ID. Tal como suena, el cmdlet “Sort-Object” provee un mecanismo para ordenar lso resultados. En este ejemplo, vamos a ordenar el comando de arriba para mostrar los resultados ordenados de los que tiene un mayor número de ocurrencias a los que tienen menos:
 
Get-EventLog System | Group-Object eventid | Sort-Object 
              Count -descending<enter>
The results are now sorted from most to least number of occurrences. Couple of things to notice here: •Hemos ordenado por la columna “Count”. Podríamso también ordenar por “Name” o por la columna que eligiéramos. •Como se muestra en el último ejemplo, podemos canalizar resultados de un cmdlet a otro y luego a otro y asi siguiendo...

Convertto-HTML

Si bien la salida de este cmdlet a veces se ve muy bien y otras no tanto, es muy rápido y no hay que escribir ningún código para convertir resultados, como había que hacer con VBScript. Enviemos el resultado del cmdlet “Get-Process” a html:
 
Get-Process | ConvertTo-html<enter>
El cmdlet realiza la conversión pero no lo graba en un archivo. Para grabar el resultado en un archivo html, vamos a usar el cmdlet “Out-File” para redirigir los resultado dentro de un archivo. Esto es similar a usar el símbolo ">” en DOS.
 
Get-Process | ConvertTo-html | out-file “Processes.html”<enter>
Para abrir el archivo .html usamos el cmdelt “Invoke-Item”. Esto es equivalente a cliquear en el archivo.
 
Invoke-Item Processes.html<enter>
El browser que tengamos como predeterminado será iniciado, presentando los resultados grabados en el archivo html. Como dije antes, no siempre luce bien... pero es rápido y el código html puede editarse, si deseamos que luzca mejor.

Export-CSV

Este es otro cmdlet de formato muy interesante. Toma los resultados y los convierte a un archivo CSV. En los siguientes ejemplos vamos a exportar los procesos y abrir el archivo resultante en una hoja de cálculo. Debe tener Excel o algún otro tipo de hoja de cálculo instalado en el sistema. Ejercicio 1. Exportar los resultados a un archivo de extensión csv
Get-Process | Export-CSV Processes.csv<enter>
Ejercicio 2. Abra la hoja de cálculo:
Invoke-Item Processes.csv
Figura 7- Archivo csv, generado por el cmdlet Export-CSV
Como se ve en la figura 7, se puede utilizar el cmdlet "Export-CSV" para documentar de manera rápida y/o crear informes. Mucho más simple que lo que se requiere para crear el mismo informe en VBScript. Como los objetos son el corazón de PowerShell y de las secuencias de comandos PowerShell, vamos a trabajar en profundidad con los objetos a medida que continuamos avanzando con PowerShell. Si usted tiene algún comentario o pregunta, por favor use la sección de comentarios abajo. Hasta el próximo artículo ...
respag
Panamá - © 2012
Haga su donación para colaborar con La Escuela del Programador

La Escuela del Programador es un sitio web sin anuncios, sin ánimo de lucro, no es un sitio web comercial. Es el sueño de compartir con todos, muchos años de una gran pasión. Si realmente encuentra este sitio útil y lo aprovecha, le pido su generosa y no importa cuán modesta colaboración, simplemente para afrontar los costos de mantener este sitio disponible en internet.
No deseo lucrar con este sitio, ya que lo hago desinteresadamente, sólo le pido que, si puede, aporte (desde un dólar hasta lo que crea que puede dar), para afrontar los costos de dominio y hosting. Muchísimas gracias y ojalá juntos podamos hacer un sitio que sea una buena fuente de aprendizaje de programacíon en español.

Si no se siente en condiciones de colaborar, igualmente será bienvenido al sitio, es libre para todos y será un placer que encuentre mis artículos provechosos, pero si realmente me ayuda con una donación minima, seguramente, colaborará para que La Escuela del Programador se mantenga en la Web y crezca, conviertiendo a este sitio hecho con mucha pasión, dedicación y esfuerzo, en una buena fuente de aprendizaje.

Mis saludos cordiales y gracias por interesarse en mi sitio.

Rubén E. Spagnuolo
respag
Panamá - © 2012