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 v2.0: Begin, Process y End

Posted by urpiano en Lunes 17 \17\UTC mayo \17\UTC 2010

Una de las nuevas características de PowerShell versión 2.0 que no incorporaba la 1.0 es la adición de las palabras clave Begin,Process y End. Estas tes palabras clave permiten definir bloques en los scripts y funciones:

  • Begin: Permite establecer una secuencia de acciones que son realizadas antes de procesar los objetos que son recibidos por encaminamiento.
  • Process: Permite establecer una secuencia de acciones que son realizadas con los objetos recibidos por encaminamiento. Es la parte que hasta ahora se podía hacer con la versión 1.0, es decir que lo recibido se procesaba directamente por la funció o script.
  • End: Permite establecer una secuencia de acciones a realizar una vez se han procesado todos los objetos que se recibieron por encaminamiento.

Esto abre un amplio abanico de posibilidades a la hora de desarrollar scripts y funciones. Vamos a poner un simple ejemplo. El siguiente script realiza lo mismo que Get-ChildItem, pero está preparado para que le pasemos por encaminamiento contenedores para ser procesados y realizar un recuento del número de contenedores procesados y la suma de los elementos obtenidos.

Para usar el script, simplemente se copia y pega en PowerShell, con lo que el script se incluye en la sesión de PowerShell y puede ser llamado como un Cmdlet más. Para un ejemplo de cómo llamarle:

Get-ChildItem -ErrorAction SilentlyContinue | Where-Object {$_.PsIsContainer -eq $true} | Get-MyChildItem

Este es el código del script:

Function Get-MyChildItem([parameter(mandatory=$false,ValueFromPipeline = $true)]
                          $Ruta = "$((Get-Location).Path)")
{
    #Inicializamos las variables de recuento
    Begin
    {
        # Estamos en la parte Begin, se ignoran los objetos recibidos por
        # canalización
        $Contenedores = 0
        $Errores = 0
        $Elementos = 0
        # Un uso típico es el mostrar un encabezado. De no estar éste en el
        # bloque Beguin, sería mostrado por cada objeto que se recibiera de
        # encaminamiento
        Write-Host "`n`rGet-MyChildItem: listado y recuento`n`r`n`r"
    }
    # Procesamos los objetos recibidos por canalización
    Process
    {
        # Establecemos control de errores, para interceptar, por ejemplo
        # el no poder acceder por falta de permisos
        Try
        {
            # Almacenamos en $a los elementos obtenidos con Get-ChildItem
            $a = Get-ChildItem $Ruta
            # Try/Catch/Finally y Trap no interceptan errores que no son de
            # terminación. En PowerShell hay errores que son de terminación
            # y errores que no lo son. En el caso de este script, si se intenta
            # listar con Get-ChildItem un contenedor en el cual no se tienen
            # permisos de acceso, se produce un error que no es de terminación.
            # Por ello se pregunta si es true $?, una variable automática de
            # PowerShell que almacena si fue exitosa o no la última operación,
            # por lo que si es true ejecutaremos el recuento de elementos y si
            # es false registraremos que se produjo el error
            If($?)
            {
                # Agregamos el número de elementos obtenidos al total
                $Elementos = $Elementos + $a.Count
                # Mostramos por pantalla el nombre del contenedor
                Write-Host "Elementos contenidos en $Ruta`:`n`r"
                # Devolvemos los elementos del contenedor 
                $a
                # Mostramos por pantalla el número de elementos que alberga el
                # contenedor
                Write-Host "`n`rTotal elementos en $Ruta`: $($a.Count)`n`r`n`r"
                # Incrementamos el número de contenedores procesados
                $Contenedores++
            }
            Else
            {
                # Mostramos que se produjo error al intentar listar el
                # contenedor
                Write-Host "Error al listar $Ruta"
                # Mostramos que el número de elementos contenidos es desconocido
                Write-Host "`n`rTotal elementos en $Ruta`: desconocido`n`r`n`r"
                # Incrementamos el número de contenedores procesados
                $Contenedores++
                # Incrementamos el número de errores obtenidos
                $Errores++
            }
        }
        Catch
        {
            # En realidad esta parte de Catch no debería ser ejecutada nunca,
            # pero la incluímos por ser obligado el poner el Cath y para que
            # sea más comprensible, y por si acaso :-)
            
            # Mostramos que se produjo error al intentar listar el
            # contenedor
            Write-Host "Error al listar $Ruta"
            # Mostramos que el número de elementos contenidos es desconocido
            Write-Host "`n`rTotal elementos en $Ruta`: desconocido`n`r`n`r"
            # Incrementamos el número de contenedores procesados
            $Contenedores++
            # Incrementamos el número de errores obtenidos
            $Errores++
        }
    }
    # Mostramos el recuento
    End
    {
        # En este bloque End procedemos a mostrar el recuento de los listados
        Write-Host "Se han listado un total de $Contenedores Contenedores con un`
total de $Elementos elementos. De los $Contenedores contenedores, $Errores no `
pudieron ser listados pues dieron error"
    }
}

Una respuesta to “PowerShell v2.0: Begin, Process y End”

  1. Elliott said

    Thanks for finally talking about >PowerShell v2.0:
    Begin, Process y End | El Blog de Gualtrysoft
    <Liked it!

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: