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

Завершено

На этом уроке в качестве терминала 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 указывает на несуществующий каталог.

  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, например.) В этом упражнении показано, как добавлять проверки. В зависимости от среды, в которой будет выполняться сценарий, может потребоваться больше или меньше проверок. Возможно, вам даже понадобятся письменные тесты; все зависит от контекста.