Exercițiul - Control flux
În această unitate, veți utiliza Azure Cloud Shell în partea dreaptă a ecranului ca terminal Linux. Azure Cloud Shell este un shell pe care îl puteți accesa prin portalul Azure sau la https://shell.azure.com. Nu trebuie să instalați nimic pe computer pentru a-l utiliza.
Atunci când scrieți scripturi, acestea pot funcționa așa cum intenționați, atât timp cât tastați valori rezonabile. Dar dacă timpul trece sau altcineva rulează scriptul, probabil că cineva va introduce o valoare neprevăzută sau că o altă condiție prealabilă nu va fi îndeplinită. Pentru a evita astfel situațiile, ar trebui să să vă sanitizați intrările; mai exact, ar trebui să adăugați logică la script pentru a vă asigura că acesta se închide mai devreme dacă ceva este în neregulă și continuă să ruleze numai dacă totul este în regulă.
Notă
Rulați următoarele comenzi doar dacă nu ați finalizat niciunul dintre exercițiile anterioare din acest modul. Presupunem că ați finalizat exercițiile anterioare. Dacă nu ați făcut acest lucru, aveți nevoie de câteva fișiere.
Dacă nu ați finalizat exercițiile anterioare din acest modul, rulați următoarele comenzi bash într-un terminal:
mkdir webapp cd webapp touch index.html app.js cd ..
Aceste comenzi vor crea un director care conține fișiere asociate de obicei cu dezvoltarea web.
Adăugarea verificărilor la parametrii scriptului
Ați lucrat cu un script de backup până acum și ați adăugat parametri la acesta. Puteți face scriptul chiar mai sigur de utilizat, adăugând verificări care asigură că scriptul continuă doar dacă a furnizat intrări rezonabile de parametri.
Să ne uităm la scenariul curent. Dacă ați terminat exercițiul anterior, ar trebui să aveți un fișier numit Backup.ps1. Dacă nu, creați fișierul și deschideți-l în editorul de cod:
touch Backup.ps1
code Backup.ps1
Adăugați acest cod la fișier:
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')"
După cum știți, scriptul nu va mai răspunde dacă $Path
indică spre un director care nu există.
Utilizați un shell PowerShell existent dacă aveți unul care rulează. În caz contrar, începeți una tastând
pwsh
într-un terminal:pwsh
Adăugați o verificare pentru parametrul
$Path
adăugând acest cod imediat după secțiuneaParam
, apoi salvați fișierul:If (-Not (Test-Path $Path)) { Throw "The source directory $Path does not exist, please specify an existing directory" }
Ați adăugat un test care verifică dacă
$Path
există. Dacă nu, oprești scriptul. De asemenea, explicați utilizatorilor ce nu a funcționat corect, astfel încât să poată remedia problema.Asigurați-vă că scriptul funcționează așa cum intenționați, rulându-l:
./Backup.ps1 -Path './app'
Ar trebui să vedeți acest rezultat:
Throw "The source directory $Path does not exist, please specify … | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | The source directory ./app does not exist, please specify an | existing directory
Testați că scriptul funcționează în continuare așa cum intenționați. (Asigurați-vă că eliminați toate fișierele backup din exercițiul anterior înainte de a continua.)
./Backup.ps1 -Path './webapp'
Ar trebui să vedeți un mesaj care arată asemănător cu acesta:
Created backup at ./backup-2021-01-19.zip
Dacă rulați din nou scriptul, acesta nu va mai răspunde. Acesta vă va anunța că fișierul zip există deja. Să remediem problema. Vom adăuga cod pentru a ne asigura că backupul este creat numai dacă nu există niciun alt fișier zip de backup din ziua curentă.
Înlocuiți codul din fișier cu acest cod, apoi salvați fișierul:
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" }
Ai făcut două lucruri aici. Mai întâi, ați creat o variabilă nouă,
$DestinationFile
. Această variabilă vă ajută să verificați dacă calea există deja. În al doilea rând, ați adăugat o logică care spune "creați fișierul zip doar dacă fișierul nu există deja". Acest cod implementează logica: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" }
Rulați codul pentru a vă asigura că scriptul nu mai răspunde și că logica dvs. este aplicată:
./Backup.ps1 -Path './webapp'
Ar trebui să vedeți acest rezultat:
Write-Error: Today's backup already exists
Felicitări. Ți-ai făcut scenariul un pic mai sigur. (Rețineți că încă este posibil să furnizați date problematice pentru $DestinationPath
, de exemplu.) Scopul acestui exercițiu este de a arăta cum să adăugați verificări. În funcție de mediul în care va rula scriptul, poate doriți mai puține sau mai multe verificări. Poate chiar vrei teste scrise; totul depinde de context.