Lesson 11

スクリプトファイルを作成する

Lesson 11 Chapter 1
スクリプトファイルを作成する

スクリプトファイルとは、PowerShellのコマンドを記述したファイルです。スクリプトファイルを作成し、実行することで、PowerShellのコマンドを再利用することができます。

次のLessonからはより実践的な自動化スクリプトを作成していきますが、その前に、まずはPowerShellのスクリプトファイルを作成する方法を学びましょう。

PowerShellでスクリプトファイルを作成するには、以下の手順を実行します。

  1. VSCodeを開き、新しいファイルを作成します。

    新しくフォルダを作成し、右クリック、「Codeで開く」を選択しVSCodeを開きます。

    image1

    ファイル作成のアイコンをクリックし、ファイルの拡張子を「.ps1」としてファイルを作成します。これは、PowerShellスクリプトファイルの拡張子です。

    image2

  2. スクリプトを作成します。

    PowerShellスクリプトは、コマンドレット、変数、条件分岐、ループなどを使用して、コマンドライン上で実行するコマンドの集合を記述するものです。例えば、以下のようなスクリプトを作成してみましょう。

    test.ps1
    Write-Host "Hello, World!"

    このスクリプトは、PowerShell上で「Hello, World!」と表示するだけのものです。

  3. 保存します。

    [Ctrl] + [S] で保存します。

以上の手順を実行することで、PowerShellのスクリプトファイルを作成することができます。スクリプトを実行する場合は、PowerShellコンソール上で「./<スクリプト名>.ps1」と入力することで実行できます。

Lesson 11 Chapter 2
関数を作成する

PowerShellでは、関数を作成することができます。関数は、再利用可能なコードの塊であり、1つ以上の引数を受け取り、実行したいコードを記述することができます。 つまり、同じ様な処理を何度も行う場合に、関数を作成することで、コードを再利用することができます。

関数を作成する手順は以下の通りです。

  1. VSCodeを開き、新しいファイルを作成します。

  2. ファイルの拡張子を「.ps1」とします。

  3. 関数を作成します。関数の構文は以下の通りです。

    powershell.ps1
    function 関数名 {
    <関数のコード>
    }

    例えば、以下のような関数を作成してみましょう。

    hello.ps1
    function Invoke-Hello {
    param(
      [string]$Name
      )
      Write-Host "Hello, $Name!"
    }

    この関数は、「$Name」という引数を受け取り、その値を使って「Hello, $Name!」というメッセージを表示するものです。

  4. 保存します。

    1. 関数を保存します。例えば、ファイル名を "MyFunctions.ps1" とする場合、以下のコマンドを実行します。

      powershell
      Save-Module -Name MyFunctions -Path [ファイルを保存しているディレクトリパス]
    2. 関数をインポートします。以下のコマンドを実行して、保存した関数をインポートしてください。

      powershell
      Import-Module [ファイルパス]/MyFunctions.ps1
    3. 関数を実行します。以下のコマンドを実行して、Invoke-Hello 関数を呼び出し、パラメーターとして 'John' を渡してください。

      powershell
      Invoke-Hello -Name 'John'

以上の手順を実行することで、PowerShellの関数を作成することができます。関数を呼び出す場合は、PowerShellコンソール上で「関数名 引数」と入力することで実行できます。例えば、上記の「Say-Hello」関数を呼び出す場合は、「Invoke-Hello -Name 'John'」と入力することで、コンソール上に「Hello, John!」と表示されます。

Lesson 11 Chapter 3
モジュールをインポートする

PowerShellには、標準機能以外のコマンドレットや関数を追加することができる「モジュール」という機能があります。モジュールを使用することで、自分でコマンドレットを作成する必要がなくなり、より高度な機能を利用することができます。

モジュールをインポートする手順は以下の通りです。

  1. VSCodeを開き、新しいファイルを作成します。
  2. ファイルの拡張子を「.ps1」とします。
  3. インポートしたいモジュールをインストールします。PowerShell Gallery(https://www.powershellgallery.com/)から、検索してインストールすることができます。
    powershell.ps1
    Install-Module <モジュール名>

    例えば、「Azure.Storage」モジュールをインストールする場合は、以下のように入力します。

    powershell.ps1
    Install-Module Azure.Storage
  4. インポートしたいモジュールをインポートします。インポートすると、モジュールで定義されたコマンドレットや関数を使用することができるようになります。

    powershell.ps1
    Import-Module <モジュール名>

    例えば、「Azure.Storage」モジュールをインポートする場合は、以下のように入力します。

    powershell.ps1
    Import-Module Azure.Storage
  5. インポートしたモジュールのコマンドレットや関数を使用します。例えば、「Azure.Storage」モジュールに含まれる「New-AzStorageAccount」コマンドレットを使用する場合は、以下のように入力します。

    powershell.ps1
    New-AzStorageAccount -ResourceGroupName <リソースグループ名> -Name <ストレージアカウント名> -Location <リージョン>

以上の手順を実行することで、PowerShellでモジュールをインポートし、コマンドレットや関数を使用することができます。また、一度インポートしたモジュールは、PowerShellを再起動するまで有効な状態となります。

PowerShell Galleryからインストールしたモジュールは、通常、コンピューターのモジュールパスの1つにあるディレクトリに保存されます。モジュールパスは、 $env:PSModulePathという環境変数によって定義されます。デフォルトのモジュールパスには、以下の3つのディレクトリが含まれています。

  • $env:ProgramFiles\WindowsPowerShell\Modules (コンピューター全体のモジュール)
  • $env:ProgramFiles(x86)\WindowsPowerShell\Modules (64ビット以外のアプリケーション向けのモジュール)
  • $env:UserProfile\Documents\WindowsPowerShell\Modules (ユーザー個人のモジュール)

したがって、Install-Moduleコマンドレットでインストールしたモジュールは、これらのディレクトリのいずれかに保存されます。どのディレクトリに保存されたかは、$env:PSModulePathの値を確認することで確認できます。また、Get-Module -ListAvailableコマンドレットを使用して、インストールされたモジュールの一覧を表示することもできます。

Lesson 11 Chapter 4
#Requireで実行要件を指定する

PowerShellスクリプトを実行する際、そのスクリプトが必要とする特定のバージョンのPowerShellがインストールされているかどうか、また必要なモジュールが読み込まれているかどうかを確認することが重要です。これにより、スクリプトがエラーを起こすのを防ぐことができます。

このような実行要件を確認するために、PowerShellでは#Requireというコマンドレットを使用することができます。このコマンドレットを使用すると、スクリプトの実行要件を指定することができます。

例えば、以下のようなスクリプトがあるとします。

powershell.ps1
#Requires -Version 5.1
Get-ChildItem

このスクリプトでは、#Requiresコマンドレットを使用して、PowerShellのバージョン5.1以上が必要であることを指定しています。もしスクリプトを実行する環境がバージョン5.1未満であった場合、スクリプトの実行は中止されます。

また、以下のようにモジュールの読み込みを指定することもできます。

powershell.ps1
#Requires -Modules MyModule
Get-MyModuleData

このスクリプトでは、#Requiresコマンドレットを使用して、MyModuleというモジュールが必要であることを指定しています。もしモジュールが読み込まれていない場合、スクリプトの実行は中止されます。

#Requiresコマンドレットはスクリプトの先頭に記述する必要があります。また、必要な実行要件が複数ある場合は、複数の#Requiresコマンドレットを使用することができます。

Lesson 11 Chapter 5
例外処理

例外処理とは、プログラムの実行中に例外が発生した場合に、その例外に対して適切な処理を行うことです。PowerShellでも例外処理を行うことができます。

例えば、ファイルが存在しない場合には、その旨を表示するなどです。 逆に、例外処理を行わない場合は、例外が発生した場合に、そのまま処理が中断されてしまいます。

例外処理は、try、catch、finallyというキーワードを使って記述します。まず、例外が発生する可能性のある処理をtryブロックで囲みます。tryブロックの中で例外が発生した場合、例外の種類に応じて適切な処理を行うためのcatchブロックを定義します。また、finallyブロックを使って、例外の有無にかかわらず必ず実行したい処理を指定することもできます。

以下は、例外処理を行うPowerShellのスクリプト例です。

powershell.ps1
try {
    # 例外が発生する可能性のある処理を記述する
    Get-Item -Path "C:\NonexistentDirectory\file.txt" -ErrorAction Stop
}
catch [System.Management.Automation.ItemNotFoundException] {
    # ItemNotFoundExceptionが発生した場合に実行する処理を記述する
    Write-Output "ファイルが見つかりませんでした。"
}
catch {
    # 上記以外の例外が発生した場合に実行する処理を記述する
    Write-Output "エラーが発生しました。"
}
finally {
    # 例外の有無にかかわらず必ず実行したい処理を記述する
    Write-Output "処理が完了しました。"
}

このスクリプトでは、Get-Itemコマンドレットによってファイルを取得しようとしていますが、存在しないファイルパスを指定しているため例外が発生します。-ErrorActionパラメータにStopを指定しているため、例外が発生した時点で実行が中断され、catchブロックに移ります。

この場合、"catch [System.Management.Automation.ItemNotFoundException]"ブロックが最初に評価されます。"catch [System.Management.Automation.ItemNotFoundException]" の部分は、「もし指定したアイテムが見つからなかった場合は、このブロックの処理を実行する」という意味です。

もし ItemNotFoundException 以外の例外が発生した場合は、2番目の catch ブロックが評価されます。 つまり、最初のブロックで特定の例外をキャッチすることができなかった場合、2番目のブロックで他の例外をキャッチすることができます。

最後に、finallyブロックによって、例外の有無にかかわらず必ず実行したい処理を指定しています。

Lesson 11 Chapter 6
終了コード

終了コードとは、プログラムやスクリプトが正常に終了したかどうかを示すために、コマンドラインで出力される数値のことです。通常、0は成功、0以外の数値はエラーを示します。

PowerShellでも終了コードを利用することができます。スクリプト内でexitコマンドを使用することで、任意の終了コードを設定することができます。例えば、以下のようにスクリプトを書くことができます。

powershell.ps1
if ($someCondition) {
    # 実行したい処理
    exit 0 # 成功した場合は0を返す
} else {
    # 実行したい処理
    exit 1 # 失敗した場合は1を返す
}

また、PowerShellでは終了コードを利用して、別のPowerShellスクリプトから処理結果を受け取ることもできます。例えば、以下のようなスクリプトを用意します。

someScript.ps1
# someScript.ps1

if ($someCondition) {
    Write-Output "Success"
    exit 0
} else {
    Write-Output "Failed"
    exit 1
}

そして、このスクリプトを別のPowerShellスクリプトから呼び出し、終了コードに基づいて処理を分岐させることができます。

callerScript.ps1
# callerScript.ps1

& ./someScript.ps1

if ($LASTEXITCODE -eq 0) {
    # 成功時の処理
} else {
    # 失敗時の処理
}

ここでは、$LASTEXITCODE変数を使用して、前に実行したコマンドまたはスクリプトの終了コードを参照しています。

Lesson 11 Chapter 7
デバッグする

PowerShellスクリプトのデバッグは、問題を追跡して修正するために非常に重要です。VSCodeは、PowerShellスクリプトのデバッグをサポートしています。

今回はデバッグするスクリプトとして下記のスクリプトを使用します。

powershell.ps1
$sum = 0
for ($i = 1; $i -le 10; $i++) {
    $sum += $i
    Write-Host "現在の合計は $sum です。"
}
Write-Host "合計は $sum です。"

このスクリプトは$sumに$i(1~10)を順に加算していくスクリプトで、出力結果は下記のようになります。

powershell
現在の合計は 1 です。
現在の合計は 3 です。
現在の合計は 6 です。
現在の合計は 10 です。
現在の合計は 15 です。
現在の合計は 21 です。
現在の合計は 28 です。
現在の合計は 36 です。
現在の合計は 45 です。
現在の合計は 55 です。
合計は 55 です。

以下は、VSCodeでPowerShellスクリプトをデバッグする手順です。

  1. スクリプトのデバッグモードを開始するため、F5キーを押します。または、[実行]メニューから[デバッグの開始]を選択します。

    image3

    画面左の「実行とデバッグ」アイコンをクリックしても構いません。

    image4

  2. VSCodeは、PowerShellスクリプトのデバッグに使用されるデフォルト設定を提供しますが、状況によってデバッグのために使用する設定を構成する事ができます。[実行]メニューから[構成を開く]→[Launch current file]を選択して、設定を変更することができます。

    image5

  3. デバッグのためにブレークポイントを設定します。コード行の左側の空白スペースにカーソルを移動し、クリックしてブレークポイントを設定します。

    image6

  4. F5キーまたは[実行]メニューから[デバッグの開始]を再度クリックして、スクリプトのデバッグを開始します。

  5. スクリプトが実行されると、ブレークポイントでスクリプトが停止します。VSCodeのデバッグツールを使用して、[F5]キーを押すことで、スクリプトをステップ実行することができます。また、変数の値や式の評価などのデバッグ情報を表示することもできます。

    image7

以上が、VSCodeでPowerShellスクリプトをデバッグする手順です。

Lesson 11 Chapter 8
スクリプトファイルを実行する

以下は、PowerShellスクリプトファイルを実行する方法の手順です。

  1. VSCodeを開きます。

  2. [Ctrl]+[N]を押して新しいファイルを作成します。

  3. スクリプトを入力します。例えば、次のスクリプトは "Hello, World!" を表示します。

    powershell.ps1
    Write-Host "Hello, World!"
  4. [Ctrl]+[S]を押して、ファイルを保存します。ファイル名は ".ps1" で終わる必要があります。例えば、"hello.ps1" という名前のファイルを作成しましょう。

  5. スクリプトファイルを実行するには、PowerShellターミナルを開く必要があります。 画面上部の「ターミナル」をクリックし、「新しいターミナル」を選択します

    image8

  6. PowerShellターミナルが開いたら、スクリプトを実行する準備が整いました。次のコマンドを入力します。

    powershell
    ./hello.ps1
  7. [Enter]を押してスクリプトを実行します。結果として、"Hello, World!" という文字列が表示されます。

以上が、PowerShellスクリプトファイルを実行する方法です。

管理者として実行する方法

PowerShellのスクリプトを管理者として実行する場合、以下の手順を実行します。

  1. VSCodeを管理者として実行する VSCodeを右クリックし、「管理者として実行する」を選択します。
  2. スクリプトを実行する
    • VSCodeでスクリプトを開きます。
    • 右上の「Run」ボタンをクリックすると、スクリプトが実行されます。
    • スクリプトに管理者権限が必要な場合、自動的に管理者権限で実行されます。

以上の手順で、PowerShellのスクリプトを管理者として実行できます。

常に「管理者として実行する」を有効化したい場合は下記の手順に従ってください

  1. VSCodeのアイコンを右クリックし、プロパティを選択する

    image9

  2. プロパティのショートカットの設定画面が表示されるので「詳細設定」をクリックする

    image10

  3. 詳細プロパティの設定画面が開くので「管理者として実行」にチェックを入れ、[OK]をクリックする

    image11

  4. [適用]をクリックし、画面を閉じる

    image12

ファイルを直接実行する

PowerShellを使用して、ファイルを直接実行する方法について説明します。これにより、PowerShellコンソールを起動せずに、スクリプトを直接実行することができます。

  1. PowerShellスクリプトを作成する。

    VSCodeなどのエディタを使用して、任意の名前で.ps1拡張子のPowerShellスクリプトファイルを作成します。

  2. ファイルの場所を確認する。

    作成したスクリプトファイルの場所を確認します。これは、PowerShellスクリプトを実行するために使用する場所に関連しています。

  3. PowerShellスクリプトを実行する。

    PowerShellスクリプトを実行するには、次の手順を実行します。

    1. ファイルエクスプローラーで、PowerShellスクリプトを右クリックし、「PowerShellで実行」を選択します。これにより、PowerShellウィンドウが開き、スクリプトが実行されます。

    2. PowerShellウィンドウを開いて、PowerShellスクリプトを直接実行します。コマンドラインでスクリプトを実行するには、次のように入力します。

      powershell
      PS C:\Path\To\Script> .\Script.ps1

      これにより、スクリプトが実行されます。

これで、PowerShellスクリプトを直接実行する方法がわかりました。ただし、スクリプトを実行する前に、PowerShellの実行ポリシーが適切に設定されていることを確認する必要があります。また、管理者として実行する必要がある場合は、管理者としてPowerShellを実行する必要があります。

コマンドラインでファイルを実行する

コマンドラインで PowerShell スクリプトを実行するには、Windows の PowerShell コマンドラインまたはターミナルを開いて、以下のように入力します。

powershell
powershell.exe -File <スクリプトファイルのパス>

例えば、C:\Users\username\Documents\myscript.ps1 というファイルを実行する場合、以下のように入力します。

powershell
powershell.exe -File C:\Users\username\Documents\myscript.ps1

この方法でスクリプトを実行する場合、スクリプトが実行中に出力されたすべての情報が表示され、実行が完了したときにコマンドラインまたはターミナルに戻ります。