演習 - フロー制御

完了

このユニットでは、Linux ターミナルとして画面の右側にある Azure Cloud Shell を使用します。 Azure Cloud Shell は、Azure portal または https://shell.azure.com でアクセスできるシェルです。 お使いのコンピューターに何もインストールしなくても使用できます。

スクリプトを記述するときに、適切な値を入力している限り、意図したとおりに動作すると考えられます。 ただし、時間が経過したり、他のユーザーがそのスクリプトを実行したりすると、誰かが意図しない値を入力したり、他の前提条件が満たされなかったりする可能性があります。 このような状況を回避するには、入力をサニタイズする必要があります。つまり、スクリプトにロジックを追加して、問題が発生した場合に早期に終了させ、すべてが良好な場合にのみ実行を継続させるようにする必要があります。

このモジュールのこれまでの演習のいずれかを完了していない場合に "のみ"、次のコマンドを実行します。 これまでの演習を完了していることを前提としています。 まだ終わっていない場合は、いくつかのファイルが必要です。

  • このモジュールのこれまでの演習を完了していない場合は、次の bash コマンドをターミナルで実行します。

    mkdir webapp
    cd webapp
    touch index.html app.js
    cd ..
    

    これらのコマンドにより、通常、Web 開発に関連付けられているファイルを含むディレクトリが作成されます。

スクリプト パラメーターにチェックを追加する

これまでにバックアップ スクリプトを操作し、パラメーターをそれに追加してきました。 適切なパラメーター入力が指定された場合にのみスクリプトが継続できるようにするチェックを追加して、スクリプトをさらに安全に使用できるようにすることができます。

現在のスクリプトを見てみましょう。 前の演習を完了した場合は、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"
    }
    

    ここでは 2 つの処理を行いました。 まず、新しい変数 $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 に問題のある入力を提供することはまだできます)。この演習では、チェックを追加する方法について説明します。 スクリプトが実行される環境によって、必要なチェックが減ったり増えたりします。 記述されたテストが必要になることもあります。すべてコンテキスト次第です。