Упражнение. Управление потоком

Завершено

Написанные сценарии будут работать, как предполагалось, только при условии ввода обоснованных значений. Однако спустя время или в случае, если сценарий запускает кто-то другой, возможен ввод некорректного значения или несоблюдение предварительного условия. Чтобы избежать подобных ситуаций, нужно выполнить отбор входных данных. То есть в сценарий следует добавить логику, позволяющую как можно раньше завершить его, если что-то пошло не так, и продолжить выполнять, если все правильно.

Примечание.

Это упражнение является необязательным. Если вы хотите выполнить это упражнение, перед началом работы необходимо создать подписку Azure. Если у вас нет учетной записи Azure или вы не хотите создавать ее в данный момент, вы можете ознакомиться с инструкциями, чтобы понять информацию, представленную.

Примечание.

В этом уроке вы используете Azure Cloud Shell в качестве терминала. Доступ к Cloud Shell можно получить через портал Azure или вход Cloud Shell. Чтобы ее использовать, не нужно ничего устанавливать на ваш ПК или ноутбук.

Примечание.

Выполняйте следующие команды, только если вы не выполнили ни одного из предыдущих упражнений в этом модуле. Предполагается, что вы выполнили предыдущие упражнения. В противном случае вам потребуется несколько файлов.

  • Если вы еще не выполнили предыдущие упражнения в этом модуле, выполните в терминале следующие команды 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 указывает на несуществующий каталог.

  1. Используйте существующую оболочку PowerShell, если она запущена. В противном случае запустите ее, введя pwsh в терминале:

    pwsh
    
  2. Добавьте проверку для параметра $Path путем ввода следующего кода сразу после раздела Param, а затем сохраните файл:

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

    Вы добавили тест, который проверяет, существует ли $Path. Если его не существует, сценарий останавливается. Вы также уведомляете пользователей о том, что пошло не так, чтобы они могли решить проблему.

  3. Убедитесь, что сценарий работает правильно, запустив его:

    ./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
    
  4. Проверьте, что сценарий по-прежнему работает правильно. (Перед продолжением обязательно удалите все файлы резервных копий из предыдущего упражнения.)

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

    Должно отобразиться сообщение следующего вида:

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

    Если запустить сценарий снова, он перестанет отвечать на запросы. Появится уведомление о том, что ZIP-файл уже существует. Давайте решим эту проблему. Мы добавим код, чтобы делать резервную копию только в том случае, если в этот день еще не было создано других ZIP-файлов резервной копии.

  5. Замените код в файле приведенным ниже кодом и сохраните файл:

    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"
    }
    
  6. Выполните код, чтобы убедиться, что сценарий не перестает отвечать на запросы и применяет логику:

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

    Вы должны увидеть следующий результат:

    Write-Error: Today's backup already exists
    

Поздравляем. Ваш сценарий стал более надежным. (Обратите внимание, что по-прежнему возможен некорректных ввод данных для $DestinationPath, например.) В этом упражнении показано, как добавлять проверки. В зависимости от среды, в которой будет выполняться сценарий, может потребоваться больше или меньше проверок. Возможно, вам даже понадобятся письменные тесты; все зависит от контекста.