Exercício – Controle de fluxo
Nesta unidade, você usará o Azure Cloud Shell no lado direito da tela como terminal do Linux. O Azure Cloud Shell é um shell que pode ser acessado por meio do portal do Azure ou em https://shell.azure.com. Você não precisa instalar nada no computador para usá-lo.
Quando você escreve scripts, eles devem funcionar da maneira esperada desde que você insira valores razoáveis. Mas, com o passar do tempo, se outras pessoas executam o script, é provável que alguém insira um valor indesejado ou que alguma outra precondição não seja atendida. Para evitar situações como essa, você deve higienizar sua entrada; ou seja, você deve adicionar lógica ao seu script para garantir que ele seja encerrado antecipadamente se algo estiver errado e continue a ser executado apenas se tudo estiver bem.
Observação
Execute os comandos a seguir somente se você não tiver concluído nenhum dos exercícios anteriores neste módulo. Estamos supondo que você tenha concluído os exercícios anteriores. Se não fez isso, você precisa de alguns arquivos.
Se você não concluiu os exercícios anteriores neste módulo, execute os seguintes comandos bash em um terminal:
mkdir webapp cd webapp touch index.html app.js cd ..
Esses comandos criarão um diretório que contém arquivos normalmente associados ao desenvolvimento para a Web.
Adicionar verificações aos parâmetros de script
Você tem trabalhado com um script de backup até agora e está adicionando parâmetros a ele. Você pode tornar o uso dele ainda mais seguro adicionando verificações que garantem que o script continue apenas caso receba uma entrada de parâmetro razoável.
Vamos examinar o script atual. Se tiver concluído o exercício anterior, você deverá ter um arquivo chamado Backup.ps1. Caso contrário, crie o arquivo e abra-o no editor de código:
touch Backup.ps1
code Backup.ps1
Adicione este código ao arquivo:
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 você sabe, o script deixará de responder se $Path
apontar para um diretório que não existe.
Use um shell do PowerShell existente se um estiver em execução. Caso contrário, inicie um digitando
pwsh
em um terminal:pwsh
Adicione uma verificação para o parâmetro
$Path
adicionando este código logo após a seçãoParam
e salve o arquivo:If (-Not (Test-Path $Path)) { Throw "The source directory $Path does not exist, please specify an existing directory" }
Você adicionou um teste que verifica se
$Path
existe. Caso não exista, você interrompe o script. Você também explica aos usuários o que deu errado para que eles possam corrigir o problema.Verifique se o script funciona conforme esperado executando-o:
./Backup.ps1 -Path './app'
Você deverá 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
Teste se o script ainda funciona conforme esperado. (Remova os arquivos de backup do exercício anterior antes de continuar.)
./Backup.ps1 -Path './webapp'
Você deverá ver uma mensagem semelhante a esta:
Created backup at ./backup-2021-01-19.zip
Se você executar o script novamente, ele deixará de responder. Ele informará que o arquivo zip já existe. Vamos corrigir o problema. Adicionaremos código para garantir que o backup seja criado somente caso nenhum outro arquivo zip de backup do dia atual exista.
Substitua o código no arquivo por este código e salve o arquivo:
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" }
Você fez duas coisas aqui. Primeiro, você criou uma variável,
$DestinationFile
. Com ela, fica mais fácil verificar se o caminho já existe. Depois disso, você adicionou uma lógica que diz para "criar o arquivo zip somente se ele ainda não existir". Este código implementa essa 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" }
Execute o código para verificar se o script não para de responder e se a lógica foi aplicada:
./Backup.ps1 -Path './webapp'
Você deverá ver este resultado:
Write-Error: Today's backup already exists
Parabéns. Você deixou o script um pouco mais seguro. (Observe que ainda é possível fornecer entradas problemáticas para $DestinationPath
, por exemplo.) A finalidade deste exercício é mostrar como adicionar verificações. Dependendo do ambiente no qual o script será executado, talvez você queira ter menos ou mais verificações. Você pode até mesmo querer testes escritos; tudo depende do contexto.