Ejercicio: Control de errores
En este ejercicio, usará un bloque Try/Catch para asegurarse de que el script deja de responder pronto si no se cumple una condición determinada. Para ello, volverá a trabajar con el script de copia de seguridad.
Supongamos que ha observado que a veces especifica una ruta de acceso errónea, lo que hace que se realice una copia de seguridad de archivos a los que no les corresponde. Decide agregar la administración de errores.
Nota
Este ejercicio es opcional. Si desea completar este ejercicio, deberá crear una suscripción de Azure antes de comenzar. Si no tiene una cuenta de Azure o no quiere crear una en este momento, puede leer las instrucciones para que comprenda la información que se presenta.
Nota
En esta unidad, usará Azure Cloud Shell como terminal. Puede acceder a Cloud Shell mediante Azure Portal o el inicio de sesión de Cloud Shell. No tienes que instalar nada en tu PC o portátil para usarlo.
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.
También necesita un archivo denominado Backup.ps1. Ejecute estos comandos:
touch Backup.ps1 code Backup.ps1Ahora que tiene un editor en ejecución, agregue el código necesario. Pegue este código en el editor y 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" }
Implementación de un requisito empresarial mediante Try/Catch
Supongamos que su empresa se dedica principalmente a compilar aplicaciones web. Estas aplicaciones constan de archivos HTML, CSS y JavaScript. Decide optimizar el script para que reconozca aplicaciones web.
Use un shell de PowerShell existente, si tiene uno en ejecución. De lo contrario, escriba
pwshen un terminal para iniciar uno:pwshAbra Backup.ps1. En la sección
Param, agregue una coma después del último parámetro y, a continuación, agregue el parámetro siguiente:[switch]$PathIsWebAppHa agregado un parámetro de modificador. Si este parámetro está presente cuando se invoca el script, se realiza la comprobación en el contenido. Después, puede determinar si se debe crear un archivo de copia de seguridad.
En la sección
Param, agregue este código y guarde el archivo:If ($PathIsWebApp -eq $True) { Try { $ContainsApplicationFiles = "$((Get-ChildItem $Path).Extension | Sort-Object -Unique)" -match '\.js|\.html|\.css' If ( -Not $ContainsApplicationFiles) { Throw "Not a web app" } Else { Write-Host "Source files look good, continuing" } } Catch { Throw "No backup created due to: $($_.Exception.Message)" } }El código anterior comprueba primero si el parámetro
$PathIsWebAppse proporciona en tiempo de ejecución. Si es así, el código continúa y obtiene una lista de extensiones de archivo del directorio que se especifica mediante$Path. En este caso, si ejecuta esa parte del código en el directorio webapp, el código siguiente imprimirá una lista de elementos:(Get-ChildItem $Path).Extension | Sort-Object -UniqueEste es el resultado:
.html .jsEn la instrucción completa, se usa el operador
-match. El operador-matchespera un patrón de expresión regular. En este caso, la expresión indica lo siguiente: "¿Coincide alguna de las extensiones de archivo con.html,.jso.css?". El resultado de la instrucción se guarda en la variable$ContainsApplicationFiles.Después, el bloque
Ifcomprueba si la variable$ContainsApplicationFilesesTrueoFalse. En este punto, el código puede tomar dos rutas de acceso:- Si el directorio de origen es para una aplicación web, el script escribe: "Source files look good, continuing" (Los archivos de código fuente son correctos. Continuando.).
-
Si el directorio de origen no es para una aplicación web, el script produce un error que indica: "Not a web app" (No es una aplicación web). El error se captura en un bloque
Catch. El script se detiene y se vuelve a generar el error con un mensaje de error mejorado.
Proporcione el modificador
$PathIsWebApppara probar el script:Nota
Antes de ejecutar el script, asegúrese de que no haya ningún archivo ZIP. Es posible que se hayan creado al completar ejercicios anteriores de este módulo. Use
Remove-Item *zippara quitarlos../Backup.ps1 -PathIsWebApp -Path './webapp'El script debería imprimir una salida similar a este texto:
Source files looks good, continuing Created backup at ./backup-2021-12-30.zipCon el terminal, cree un directorio denominado python-app. En el nuevo directorio, cree un archivo denominado script.py:
mkdir python-app cd python-app touch script.py cd ..Ahora el aspecto del directorio debería ser así:
-| webapp/ ---| app.js ---| index.html -| python-app/ ---| script.py -| Backup.ps1En el shell de PowerShell, vuelva a ejecutar el script, pero esta vez cambie el valor
-Pathpara que apunte a./python-app:./Backup.ps1 -PathIsWebApp -Path './python-app'Ahora el script debería imprimir este texto:
No backup created due to: Not a web appLa salida indica que no se pudo realizar la comprobación. Esto es correcto, ya que no hay ningún archivo en el directorio que tenga una extensión .html, .js o .css. El código produjo una excepción que se capturó mediante el bloque
Catchy el script se detuvo pronto.Enhorabuena. Ha implementado un requisito empresarial.