TEMA
    about_Functions

DESCRIPCIÓN BREVE
    Describe cómo crear y utilizar las funciones en Windows PowerShell. 


DESCRIPCIÓN DETALLADA
    Una función es una lista de instrucciones que tiene el nombre que 
    se le asigna. Cuando se ejecuta una función, se escribe su nombre. Las 
    instrucciones de la lista se ejecutan como si las hubiera escrito en 
    el símbolo del sistema. 

    Al igual que los cmdlets, las funciones pueden tener parámetros. 
    Los parámetros pueden ser con nombre, posicionales, de 
    modificador o dinámicos. Los parámetros de función se pueden leer 
    desde la línea de comandos o desde la canalización. 

    Las funciones pueden devolver valores que se pueden mostrar, 
    asignar a variables o pasar a otras funciones o a cmdlets. 

    La lista de instrucciones de la función puede contener tipos 
    diferentes de listas de instrucciones con las palabras clave 
    Begin, Process y End. Estas listas de instrucciones controlan de 
    manera diferente las entradas procedentes de la canalización.

    Un filtro es un tipo especial de función que utiliza la palabra 
    clave Filter. 

    Las funciones también pueden comportarse como cmdlets. Se puede 
    crear una función que funcione exactamente igual que un cmdlet 
    sin utilizar la programación en C#. Para obtener más información, vea 
    about_Functions_Advanced.


  Sintaxis
      A continuación se muestra la sintaxis de una función:

          function [<ámbito:>]<nombre> [([tipo]$parámetro1[,[tipo]$par
          ámetro2])] 
          {
              param([tipo]$parámetro1 [,[tipo]$parámetro2])

              dynamicparam {<lista de instrucciones>}
  
              begin {<lista de instrucciones>}
              process {<lista de instrucciones>}
              end {<lista de instrucciones>}
          }


      Una función incluye los elementos siguientes:

          - Una palabra clave Function
          - Un ámbito (opcional)
          - Un nombre que se selecciona
          - Cualquier cantidad de parámetros con nombre (opcionales)
          - Uno o más comandos de Windows PowerShell agregados entre 
            llaves ({}) 


      Para obtener más información sobre la palabra clave 
      Dynamicparam y los parámetros dinámicos en las funciones, vea 
      about_Functions_Advanced_Parameters.


  Funciones simples
      Las funciones no tienen que ser complicadas para resultar 
      útiles. La función siguiente obtiene las variables de entorno que no 
      pertenecen a la cuenta System del sistema actual: 

          function other_env 
          { 
             get-wmiObject win32_environment | 
                where {$_.nombreusuario -ne "<System>"}
          }

      Para ejecutar la función, escriba "other_env". 

      Se puede crear un cuadro de herramientas de funciones sencillas 
      que resulten útiles. En about_Profiles y más adelante en este 
      tema se describe cómo agregar estas funciones al perfil de 
      Windows PowerShell.


  Funciones con parámetros
      Se pueden utilizar parámetros con las funciones, incluidos los 
      parámetros con nombre, posicionales, de modificador y 
      dinámicos. Para obtener más información sobre los parámetros 
      dinámicos en las funciones, vea about_Functions_Advanced_Parameters.


  Parámetros con nombre
      Es posible definir cualquier cantidad de parámetros con nombre. 
      Para los parámetros con nombre se puede incluir un valor 
      predeterminado, tal y como se describe más adelante en este tema.

      Los parámetros se pueden definir entre llaves mediante la 
      palabra clave Param, como se muestra en la sintaxis de ejemplo 
      siguiente:
    
          function <nombre> { 
               param ([tipo]$parámetro1[,[tipo]$parámetro2])
               <lista de instrucciones> 
          }


      También es posible definir los parámetros fuera de las llaves 
      sin utilizar la palabra clave Param, como se muestra en la 
      sintaxis de ejemplo siguiente:

          function <nombre> [([tipo]$parámetro1[,[tipo]$parámetro2])] { 
              <lista de instrucciones> 
          }


      No hay ninguna diferencia entre estos dos métodos. Puede 
      utilizarse el que se prefiera.

      Al ejecutar la función, el valor que se proporciona a un 
      parámetro se asigna a una variable que contiene el nombre del 
      parámetro. El valor de esa variable se puede utilizar en la 
      función. 

      El ejemplo siguiente es una función denominada Small_files. 
      Esta función tiene un parámetro $size. La función muestra todos 
      los archivos de tamaño inferior al valor del parámetro de $size 
      y excluye los directorios:

          function small_files {
              param ($size)
              Get-ChildItem c:\ | where {
                  $_.length -lt $size -and !$_.PSIsContainer} 
          }


      En la función es posible utilizar la variable $size, que es el 
      nombre definido para el parámetro.

      Para utilizar esta función, se escribe el comando siguiente:
 
          C:\PS> function small_files -size 50


      También se puede especificar un valor para un parámetro con 
      nombre sin el nombre del parámetro. Por ejemplo, el comando 
      siguiente proporciona el mismo resultado que un comando que 
      incluye el nombre del parámetro Size:

          C:\PS> function small_files 50


      Para definir un valor predeterminado para un parámetro, se 
      escribe un signo igual y el valor después del nombre del 
      parámetro, como se muestra en la variación siguiente del ejemplo de 
      Small_files:

          function small_files ($size = 100) {
              Get-ChildItem c:\ | where {
                  $_.length -lt $size -and !$_.PSIsContainer} 
          }


      Si se escribe "small_files" sin un valor, la función asigna 100 
      a $size. Si se proporciona un valor, la función utiliza ese valor.


  Parámetros posicionales
      Un parámetro posicional es un parámetro sin nombre de 
      parámetro. Windows PowerShell utiliza el orden de los valores 
      del parámetro para asociar cada uno de esos valores a un 
      parámetro de la función. 

      Cuando se utilizan parámetros posicionales, deben escribirse 
      uno o más valores después del nombre de la función. Los valores 
      de los parámetros posicionales se asignan a la variable de 
      matriz $args. El valor que sigue al nombre de la función se 
      asigna a la primera posición de la matriz $args, $args[0]. 

      La función Extension siguiente agrega la extensión .txt a un 
      nombre de archivo proporcionado por el usuario:

          function extension {
              $name = $args[0] + ".txt"
              $name
          }

          C:\PS> extension miArchivoDeTexto
          miArchivoDeTexto.txt
   
      Las funciones pueden tomar más de un parámetro posicional. 
      En el ejemplo siguiente se muestran todos los valores 
      especificados con el nombre de la función.

          function repeat { foreach ($arg in $args) { "La entrada es 
          $arg" } }

          C:\PS>repeat uno 
          La entrada es uno

          C:\PS> repeat uno dos tres
          La entrada es uno
          La entrada es dos 
          La entrada es tres


      Esta función se puede utilizar con cualquier número de valores. 
      La función asigna cada valor a una posición de la matriz $args.


  Parámetros de modificador
      Un modificador es un parámetro que no requiere un valor. En su 
      lugar, se escribe el nombre de la función seguido por el nombre 
      del parámetro de modificador.

      Para definir un parámetro de modificador, se especifica el tipo 
      [switch] antes del nombre del parámetro, como se muestra en el 
      ejemplo siguiente:

          function switchExample {
              param ([switch]$on)
              if ($on) { "Modificador sí" }
              else { "Modificador no" }
          }


      Si se escribe el parámetro de modificador On después del nombre 
      de la función, la función muestra "Modificador sí". Sin el 
      parámetro de modificador, muestra "Modificador no"

          C:\PS> SwitchExample -on
          Modificador sí

          C:\PS> SwitchExample
          Modificador no

      También se puede asignar un valor booleano a un modificador 
      cuando se ejecuta la función, como se muestra en el ejemplo 
      siguiente:

          C:\PS> SwitchExample -on:$true
          Modificador sí

          C:\PS> SwitchExample -on:$false
          Modificador no


  Canalizar objetos a las funciones
      Cualquier función puede aceptar entradas procedentes de la 
      canalización. Puede controlar cómo procesa una función las entradas 
      procedentes de la canalización mediante las palabras clave Begin, 
      Process y End. En la sintaxis de ejemplo siguiente se muestran las 
      tres palabras clave:

          function <nombre> { 
              begin {<lista de instrucciones>}
              process {<lista de instrucciones>}
              end {<lista de instrucciones>}
          }

      La lista de instrucciones Begin se ejecuta una sola vez al 
      principio de la función. 

      La lista de instrucciones Process se ejecuta una vez por cada 
      objeto de la canalización.
      Mientras se está ejecutando el bloque Process, los objetos de 
      la canalización se van asignando de uno en uno a la variable 
      automática $_. 

      Una vez que la función ha recibido todos los objetos de la 
      canalización, se ejecuta una vez la lista de instrucciones End. 
      Si no se utiliza ninguna de las palabras clave Begin, Process o 
      End, todas las instrucciones se tratan como si fueran una lista de 
      instrucciones End.

      En la función siguiente se utiliza la palabra clave Process. La 
      función muestra los ejemplos de la canalización:

          function pipelineFunction 
          { 
              process {"El valor es: $_"} 
          }


      Para demostrar cómo funciona esta función, se especifica una 
      matriz de números creada con comas, como se muestra en el 
      ejemplo siguiente:

          C:\PS> 1,2,4 | pipelineFunction
          El valor es: 1
          El valor es: 2
          El valor es: 4


      Cuando se utiliza una función en una canalización, los objetos 
      canalizados a la función se asignan a la variable automática 
      $input. La función ejecuta las instrucciones con la palabra 
      clave Begin antes de que entre ningún objeto procedente de la 
      canalización. La función ejecuta las instrucciones con la 
      palabra clave End después de haber recibido todos los objetos 
      desde la canalización.

      En el ejemplo siguiente se muestra la variable automática 
      $input con las palabras clave Begin y End.

          function PipelineBeginEnd 
          {
              begin {"Inicio: La entrada es $input"} end {"Fin:  La 
              entrada es $input" } 
          }


      Si esta función se ejecuta mediante la canalización, muestra 
      los resultados siguientes:

          C:\PS> 1,2,4 | PipelineBeginEnd
          Inicio: La entrada es 
          Fin:  La entrada es 1 2 4


      Cuando se ejecuta la instrucción Begin, la función no tiene 
      todavía la entrada de la canalización. La instrucción End se 
      ejecuta después de que la función haya recibido los valores.

      Si la función tiene una palabra clave Process, lee los datos 
      que hay en $input. En el ejemplo siguiente hay una lista de 
      instrucciones de Process:

          function PipelineInput
          {
              process {"Procesando: $_ " }
              end {"Fin:  La entrada es: $input" } 
          } 

      En este ejemplo, cada objeto que se canaliza a la función se 
      envía a la lista de instrucciones de Process. Las instrucciones 
      de Process se ejecutan para cada objeto de uno en uno. La 
      variable automática $input está vacía cuando la función llega a 
      la palabra clave End.

          C:\PS> 1,2,4 | PipelineInput
          Procesando: 1 
          Procesando: 2 
          Procesando: 4 
          Fin:  La entrada es:


  Filtros
      Un filtro es un tipo de función que se ejecuta en cada objeto de la 
      canalización. Un filtro se parece una función con todas sus 
      instrucciones en un bloque Process.

      La sintaxis de un filtro es la siguiente: 

          filter [<ámbito:>]<nombre> {<lista de instrucciones>}

      El filtro siguiente toma las entradas de registro de la 
      canalización y, a continuación, muestra la entrada entera o 
      bien únicamente la parte de ella correspondiente al mensaje:

          filter ErrorLog ([switch]$message)
          {
              if ($message) { out-host -inputobject $_.Message } else 
              { $_ }  
          }


  Ámbito de una función
      Una función existe en el ámbito en el que se creó. 

      Si una función forma parte de un script, la función está 
      disponible para todas las instrucciones contenidas en ese 
      script. De forma predeterminada, una función de un script no 
      está disponible en el símbolo del sistema. 

      El ámbito de una función se puede especificar. Por ejemplo, en 
      el ejemplo siguiente la función se agrega al ámbito global: 

 
          function global:get-dependentsvs { get-service | where 
          {$_.dependentservices} }


      Cuando una función pertenece al ámbito global, puede utilizarla 
      en scripts, en funciones y en la línea de comandos.

      Las funciones suelen crear un ámbito. Los elementos creados en 
      una función, tales como las variables, existen solamente en el 
      ámbito de la función.

      Para obtener más información sobre el ámbito en Windows 
      PowerShell, vea about_Scope.

        
  Buscar y administrar funciones mediante la unidad Function: Todas 
      las funciones y los filtros de Windows PowerShell se almacenan 
      automáticamente en la unidad Function:. El proveedor Function de Windows 
      PowerShell expone esta unidad.

      Al hacer referencia a la unidad Function:, es preciso escribir 
      un signo de dos puntos después del término Function, tal y como 
      se haría para referirse a la unidad C o D de un equipo.

      En el comando siguiente se muestran todas las funciones de la 
      sesión actual de Windows PowerShell:

          C:\PS>  dir function:


      Los comandos de la función se almacenan como un bloque de 
      script en la propiedad de definición de la función. Por 
      ejemplo, para mostrar los comandos de la función Help que se 
      suministra con Windows PowerShell, se escribe:

          (dir function:help).definition

      Para obtener más información sobre la unidad Function:, vea 
      Function.


  Reutilizar funciones en sesiones nuevas
      Cuando se escribe una función en el símbolo del sistema de 
      Windows PowerShell, la función pasa a formar parte de la sesión 
      actual. Está disponible hasta que finaliza esta sesión. 

      Para utilizar la función en todas las sesiones de Windows 
      PowerShell, deberá agregarse la función al perfil de Windows 
      PowerShell del usuario. Para obtener más información sobre los 
      perfiles, vea about_Profiles.

      También se puede guardar la función en un archivo de script de 
      Windows PowerShell. Para ello, se escribe la función en un 
      archivo de texto y, a continuación, este archivo se guarda con 
      la extensión de nombre de archivo .ps1.


  Escribir ayuda para las funciones
    El cmdlet Get-Help permite ver la ayuda de las funciones, así 
    como de los cmdlets, proveedores y scripts. Para ver la ayuda de 
    una función, se escribe Get-Help y, a continuación, el nombre de 
    la función.

    Por ejemplo, para ver la ayuda de la función MisDiscos, se debe 
    escribir:

        get-help MisDiscos

    Puede escribir la ayuda de una función mediante cualquiera de los 
    dos métodos siguientes:

    --  Ayuda basada en comentario para funciones

        Es posible crear un tema de ayuda mediante el uso de palabras 
        clave especiales en los comentarios. Para crear ayuda basada 
        en comentario para una función, los comentarios se deben 
        colocar al principio o al final del cuerpo de la función o en 
        las líneas que preceden a la palabra clave function. Para 
        obtener más información sobre la ayuda basada en comentario, vea 
        about_Comment_Based_Help.

    --  Ayuda basada en XML para funciones

        Se crea un tema de ayuda basada en XML, del tipo de los que 
        suelen crearse para los cmdlets. La ayuda basada en XML es 
        necesaria cuando se van a traducir los temas de ayuda a 
        varios idiomas. 

        Para asociar la función al tema de ayuda basada en XML, se 
        utiliza la palabra clave de comentario de ayuda 
        .ExternalHelp. Para obtener más información sobre la palabra clave 
        ExternalHelp, vea about_Comment_Based_Help. Para obtener más 
        información sobre la ayuda basada en XML, vea el tema acerca de cómo 
        se escribe la ayuda de los cmdlets en MSDN.



VEA TAMBIÉN 
    about_Automatic_Variables 
    about_Comment_Based_Help
    about_Functions_Advanced 
    about_Functions_CmdletBindingAttribute
    about_Parameters
    about_Profiles
    about_Scopes
    about_Script_Blocks
    Function (proveedor)




Tabla de contenido