Parámetros

Completado

Después de crear algunos scripts, es posible que observe que no son flexibles. No es eficaz acceder a los scripts para cambiarlos. La mejor manera de controlar los cambios consiste en usar parámetros.

El uso de parámetros hace que los scripts sean flexibles, dado que permite a los usuarios seleccionar opciones o enviar entradas a los scripts. No tendrá que cambiar los scripts con frecuencia, ya que en algunos casos solo necesitará cambiar un valor de parámetro.

Todos los cmdlets, funciones y scripts aceptan parámetros.

Declaración y uso de un parámetro

Para declarar un parámetro, debe usar la palabra clave Param con un paréntesis de apertura y cierre:

Param()

Dentro de los paréntesis, se definen los parámetros, separados por comas. Una declaración de parámetro típica es similar a la siguiente:

# CreateFile.ps1
Param (
  $Path
)
New-Item $Path # Creates a new file at $Path.
Write-Host "File $Path was created"

El script tiene un parámetro $Path que se usa posteriormente en el script para crear un archivo. El script es ahora más flexible.

Uso del parámetro

Para llamar a un script con un parámetro, debe proporcionar un nombre y un valor. Supongamos que el script anterior se denomina CreateFile.ps1. Puede llamarlo de la manera siguiente:

./CreateFile.ps1 -Path './newfile.txt' # File ./newfile.txt was created.
./CreateFile.ps1 -Path './anotherfile.txt' # File ./anotherfile.txt was created.

Dado que ha usado un parámetro, no es necesario cambiar el archivo de script cuando quiera llamar al archivo de otra forma.

Nota:

Es posible que este script en concreto no se beneficie mucho del uso de un parámetro porque solo llama a New-Item, pero en cuanto tenga unas líneas de longitud, el uso del parámetro habrá merecido la pena.

Mejora de los parámetros

Cuando cree por primera vez un script que usa parámetros, probablemente recordará con exactitud para qué son los parámetros y qué valores son razonables para ellos. A medida que pase el tiempo, lo más seguro es que olvide estos detalles. También es posible que le interese proporcionarle un script a un compañero de trabajo. La solución en estos casos consiste en ser explícito, ya que esto facilita el uso de los scripts. Le conviene que un script produzca un error pronto si se pasan valores de parámetro que no son razonables. Debe tener en cuenta lo siguiente cuando vaya a definir un parámetro:

  • ¿Es obligatorio? ¿Es un parámetro opcional u obligatorio?
  • ¿Qué valores se permiten? ¿Qué valores son razonables?
  • ¿Acepta más de un tipo de valor? ¿Acepta el parámetro cualquier tipo de valor, como una cadena, un valor booleano, un entero y un objeto?
  • ¿Puede el parámetro basarse en un valor predeterminado? ¿Puede omitir el valor y basarse en un valor predeterminado en su lugar?
  • ¿Puede mejorar aún más la experiencia del usuario? ¿Puede resultar aún más claro para el usuario si proporciona un mensaje de ayuda?

Elección de un método

Todos los parámetros son opcionales de forma predeterminada. El valor predeterminado puede funcionar en algunos casos, pero a veces necesitará que el usuario proporcione valores de parámetro, y estos deben ser razonables. Si el usuario no proporciona un valor a un parámetro, el script debe dejar de ejecutarse o indicarle al usuario cómo corregir el problema. El peor escenario es que el script continúe y realice acciones que no quiere que haga.

Puede usar dos métodos para que el script sea más seguro: escribir código personalizado para inspeccionar el valor del parámetro O bien, puede usar decoradores que prácticamente hacen lo mismo. Veamos ambos métodos.

  • Use If/Else. La construcción If/Else permite comprobar el valor de un parámetro y decidir qué hacer. Este es un ejemplo:

    Param(
       $Path
    )
    If (-Not $Path -eq '') {
       New-Item $Path
       Write-Host "File created at path $Path"
    } Else {
       Write-Error "Path cannot be empty"
    } 
    

    El script ejecutará Write-Error si no proporciona un valor para $Path.

  • Utiliza el Parameter[] decorador. Una manera más recomendable y que requiere menos escritura es usar el decorador Parameter[]:

    Param(
       [Parameter(Mandatory)]
       $Path
    )
    New-Item $Path
    Write-Host "File created at path $Path"
    

    Si ejecuta este script y omite un valor para $Path, aparecerá un cuadro de diálogo que le solicitará el valor:

    cmdlet CreateFile.ps1 at command pipeline position 1
    Supply values for the following parameters:
    Path:
    

    Puede mejorar este decorador si proporciona un mensaje de ayuda que los usuarios verán al ejecutar el script:

    [Parameter(Mandatory, HelpMessage = "Please provide a valid path")]
    

    Cuando ejecute el script, recibirá un mensaje que le indicará que escriba !? para obtener más información:

    cmdlet CreateFile.ps1 at command pipeline position 1
    Supply values for the following parameters:
    (Type !? for Help.)
    Path: !?  # You type !?
    Please provide a valid path  # Your Help message.
    
  • Asigne un tipo. Si asigna un tipo a un parámetro, puede establecer que el parámetro acepta solo cadenas, no valores booleanos, por ejemplo. De este modo, el usuario sabe qué puede esperar. Para asignar un tipo a un parámetro, antepóngale el tipo entre corchetes:

    Param(
       [string]$Path
    )
    

Estos tres métodos no se excluyen mutuamente. Puede combinarlos para que el script sea más seguro.