Упражнение. Управление потоком
На этом уроке в качестве терминала Linux необходимо использовать Azure Cloud Shell в правой части экрана. Azure Cloud Shell — это оболочка, к которой можно получить доступ на портале Azure или по адресу https://shell.azure.com. Чтобы ее использовать, не нужно ничего устанавливать на ваш компьютер.
Написанные сценарии будут работать, как предполагалось, только при условии ввода обоснованных значений. Однако спустя время или в случае, если сценарий запускает кто-то другой, возможен ввод некорректного значения или несоблюдение предварительного условия. Чтобы избежать подобных ситуаций, нужно выполнить отбор входных данных. То есть в сценарий следует добавить логику, позволяющую как можно раньше завершить его, если что-то пошло не так, и продолжить выполнять, если все правильно.
Примечание.
Выполняйте следующие команды, только если вы не выполнили ни одного из предыдущих упражнений в этом модуле. Предполагается, что вы выполнили предыдущие упражнения. В противном случае вам потребуется несколько файлов.
Если вы еще не выполнили предыдущие упражнения в этом модуле, выполните в терминале следующие команды Bash:
mkdir webapp cd webapp touch index.html app.js cd ..
Эти команды создают каталог, содержащий файлы, обычно используемые в веб-разработке.
Добавление проверок в параметры сценария
До сих пор вы работали со сценарием резервного копирования и добавляли в него параметры. Теперь можно дополнительно повысить надежность этого сценария, включив проверки, благодаря которым сценарий будет выполняться только в том случае, если для его параметров введены обоснованные входные данные.
Рассмотрим текущий сценарий. Если вы выполнили предыдущее упражнение, у вас должен быть файл с именем Backup.ps1. Если нет, создайте файл и откройте его в редакторе кода.
touch Backup.ps1
code Backup.ps1
Добавьте в этот файл следующий код:
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')"
Как известно, сценарий перестанет отвечать, если $Path
указывает на несуществующий каталог.
Используйте существующую оболочку PowerShell, если она запущена. В противном случае запустите ее, введя
pwsh
в терминале:pwsh
Добавьте проверку для параметра
$Path
путем ввода следующего кода сразу после разделаParam
, а затем сохраните файл:If (-Not (Test-Path $Path)) { Throw "The source directory $Path does not exist, please specify an existing directory" }
Вы добавили тест, который проверяет, существует ли
$Path
. Если его не существует, сценарий останавливается. Вы также уведомляете пользователей о том, что пошло не так, чтобы они могли решить проблему.Убедитесь, что сценарий работает правильно, запустив его:
./Backup.ps1 -Path './app'
Вы должны увидеть следующий результат:
Throw "The source directory $Path does not exist, please specify … | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | The source directory ./app does not exist, please specify an | existing directory
Проверьте, что сценарий по-прежнему работает правильно. (Перед продолжением обязательно удалите все файлы резервных копий из предыдущего упражнения.)
./Backup.ps1 -Path './webapp'
Должно отобразиться сообщение следующего вида:
Created backup at ./backup-2021-01-19.zip
Если запустить сценарий снова, он перестанет отвечать на запросы. Появится уведомление о том, что ZIP-файл уже существует. Давайте решим эту проблему. Мы добавим код, чтобы делать резервную копию только в том случае, если в этот день еще не было создано других ZIP-файлов резервной копии.
Замените код в файле приведенным ниже кодом и сохраните файл:
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" }
Здесь реализовано две цели. Во-первых, вы создали новую переменную –
$DestinationFile
. Эта переменная позволяет легко проверить, существует ли путь. Во-вторых, вы добавили логику, согласно которой "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" }
Выполните код, чтобы убедиться, что сценарий не перестает отвечать на запросы и применяет логику:
./Backup.ps1 -Path './webapp'
Вы должны увидеть следующий результат:
Write-Error: Today's backup already exists
Поздравляем. Ваш сценарий стал более надежным. (Обратите внимание, что по-прежнему возможен некорректных ввод данных для $DestinationPath
, например.) В этом упражнении показано, как добавлять проверки. В зависимости от среды, в которой будет выполняться сценарий, может потребоваться больше или меньше проверок. Возможно, вам даже понадобятся письменные тесты; все зависит от контекста.