Ejercicio: Control del flujo

Completado

En esta unidad, usará Azure Cloud Shell en el lado derecho de la pantalla como terminal de Linux. Azure Cloud Shell es un shell al que puede acceder mediante Azure Portal o desde https://shell.azure.com. Para usarlo no es necesario instalar nada en el equipo.

Al escribir scripts, funcionarán según lo previsto siempre y cuando se escriban valores razonables. Pero si pasa el tiempo o si otra persona ejecuta el script, es probable que se introduzca un valor no deseado o que no se cumpla otra condición previa. Para evitar situaciones como esta, debería sanear su entrada; es decir, debe agregar lógica al script para asegurarse de que deje de ejecutarse pronto si hay algún problema y que siga ejecutándose únicamente si todo es correcto.

Nota:

Ejecute los comandos siguientes solo si no ha completado ninguno de los ejercicios anteriores de este módulo. Vamos a suponer que ha completado los ejercicios anteriores. Si no lo ha hecho, necesitará algunos archivos.

  • Si no ha completado los ejercicios anteriores de este módulo, ejecute los comandos siguientes de bash en un terminal:

    mkdir webapp
    cd webapp
    touch index.html app.js
    cd ..
    

    Estos comandos crearán un directorio que contiene archivos que suelen asociarse al desarrollo web.

Incorporación de comprobaciones a los parámetros de script

Hasta ahora ha estado trabajando con un script de copia de seguridad y le ha ido agregando parámetros. Puede hacer que el script sea todavía más seguro de usar si agrega comprobaciones que garanticen que el script solo siga ejecutándose si se proporciona una entrada de parámetro razonable.

Veamos el script actual. Si completó el ejercicio anterior, debería tener un archivo denominado Backup.ps1. Si no es así, cree el archivo y ábralo en el editor de código:

touch Backup.ps1
code Backup.ps1

Agregue este código al archivo:

Param(
  [string]$Path = './app',
  [string]$DestinationPath = './'
)
$date = Get-Date -format "yyyy-MM-dd"
Compress-Archive -Path $Path -CompressionLevel 'Fastest' -DestinationPath "$($DestinationPath + 'backup-' + $date)"
Write-Host "Created backup at $($DestinationPath + 'backup-' + $date + '.zip')"

Como ya sabe, el script dejará de responder si $Path apunta a un directorio que no existe.

  1. Use un shell de PowerShell existente si tiene uno en ejecución. De lo contrario, escriba pwsh en un terminal para iniciar uno:

    pwsh
    
  2. Agregue este código justo después de la sección Param a fin de incluir una comprobación para el parámetro $Path; luego, guarde el archivo:

    If (-Not (Test-Path $Path)) 
    {
      Throw "The source directory $Path does not exist, please specify an existing directory"
    }
    

    Ha agregado una prueba que verifica si $Path existe. Si no es así, el script se detiene. También se explica a los usuarios cuál es el problema para que puedan solucionarlo.

  3. Ejecute el script para asegurarse de que funciona según lo previsto:

    ./Backup.ps1 -Path './app'
    

    Debería ver este resultado:

    Throw "The source directory $Path does not exist, please specify  …
      |      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      | The source directory ./app does not exist, please specify an
      | existing directory
    
  4. Compruebe que el script sigue funcionando según lo previsto. (Asegúrese de quitar los archivos de copia de seguridad del ejercicio anterior antes de continuar).

    ./Backup.ps1 -Path './webapp'
    

    Debería ver un mensaje similar a este:

    Created backup at ./backup-2021-01-19.zip 
    

    Si vuelve a ejecutar el script, dejará de responder. Le notificará que el archivo ZIP ya existe. Vamos a solucionar este problema. Agregaremos código para asegurarnos de que la copia de seguridad solo se crea si no existe ningún otro archivo ZIP de copia de seguridad del día actual.

  5. Reemplace el código del archivo por el siguiente y luego guarde el archivo:

    Param(
      [string]$Path = './app',
      [string]$DestinationPath = './'
    )
    If (-Not (Test-Path $Path)) 
    {
      Throw "The source directory $Path does not exist, please specify an existing directory"
    }
    $date = Get-Date -format "yyyy-MM-dd"
    $DestinationFile = "$($DestinationPath + 'backup-' + $date + '.zip')"
    If (-Not (Test-Path $DestinationFile)) 
    {
      Compress-Archive -Path $Path -CompressionLevel 'Fastest' -DestinationPath "$($DestinationPath + 'backup-' + $date)"
      Write-Host "Created backup at $($DestinationPath + 'backup-' + $date + '.zip')"
    } Else {
      Write-Error "Today's backup already exists"
    }
    

    Aquí ha hecho dos cosas. En primer lugar, ha creado una variable ($DestinationFile) que hace que sea fácil comprobar si la ruta de acceso ya existe. En segundo lugar, ha agregado lógica que especifica "crear el archivo ZIP solo si el archivo aún no existe". Este código implementa la lógica:

    If (-Not (Test-Path $DestinationFile)) 
    {
      Compress-Archive -Path $Path -CompressionLevel 'Fastest' -DestinationPath "$($DestinationPath + 'backup-' + $date)"
      Write-Host "Created backup at $($DestinationPath + 'backup-' + $date + '.zip')"
    } Else {
      Write-Error "Today's backup already exists"
    }
    
  6. Ejecute el código para asegurarse de que el script no deja de responder y que se aplica la lógica:

    ./Backup.ps1 -Path './webapp' 
    

    Debería ver este resultado:

    Write-Error: Today's backup already exists
    

¡Enhorabuena! Ha hecho que el script sea un poco más seguro. (Tenga en cuenta que sigue siendo posible proporcionar entradas problemáticas a $DestinationPath, por ejemplo). El objetivo de este ejercicio consiste en mostrar cómo se agregan las comprobaciones. En función del entorno en el que se ejecute el script, le interesará que haya más o menos comprobaciones. Es posible que incluso quiera realizar pruebas escritas; todo depende del contexto.