パラメーター

完了

スクリプトをいくつか作成すると、スクリプトの柔軟性が低下することがあります。 スクリプトを調べて変更するという方法は効率的ではありません。 変更を処理するより優れた方法があります。パラメーターを使用するというものです。

パラメーターを使用すると、ユーザーがオプションを選択したり、スクリプトに入力を送信したりできるので、スクリプトが柔軟になります。 場合によっては、パラメーター値を変更するだけで済むため、スクリプトを頻繁に変更する必要がなくなります。

コマンドレット、関数、スクリプトはすべて、パラメーターを受け取ります。

パラメーターを宣言して使用する

パラメーターを宣言するには、キーワード Param を開きかっこと閉じかっことともに使用する必要があります。

Param()

かっこ内で、パラメーターをコンマで区切って定義します。 一般的なパラメーター宣言は次のようになります。

# CreateFile.ps1
Param (
  $Path
)
New-Item $Path # Creates a new file at $Path.
Write-Host "File $Path was created"

スクリプトには、ファイルを作成するために後からスクリプトで使用される $Path パラメーターが記されています。 これでスクリプトの柔軟性が向上しました。

パラメーターを使用する

パラメーターを使用してスクリプトを呼び出すには、名前と値を指定する必要があります。 上記のスクリプトを CreateFile.ps1 と呼ぶことにします。 これを次のように呼び出します。

./CreateFile.ps1 -Path './newfile.txt' # File ./newfile.txt was created.
./CreateFile.ps1 -Path './anotherfile.txt' # File ./anotherfile.txt was created.

パラメーターを使用したので、このスクリプト ファイルを別の呼び方にするときに、ファイルを変更する必要はありません。

この特定のスクリプトは、New-Item を呼び出すだけなので、パラメーターを使用してもあまりメリットが得られない可能性があります。 スクリプトが数行長ければ、パラメーターを使用する甲斐があります。

パラメーターを改善する

パラメーターを使用するスクリプトを最初に作成したときには、そのパラメーターの目的やパラメーターにとって妥当な値を正確に覚えていると思います。 時間が経つにつれ、これらの詳細を忘れてしまう可能性があります。 また、同僚にスクリプトを提供することもあります。 これらの場合の解決策は明確にすることであり、これによってスクリプトが使いやすくなります。 不適切なパラメーター値が渡された場合には、スクリプトを早期に失敗させる必要があります。 次に、パラメーターを定義するときに考慮すべき点をいくつか説明します。

  • 必須ですか。 パラメーターは省略可能ですか、必須ですか。
  • どのような値を使用できますか。 どのような値が適切ですか。
  • 複数の型の値を受け入れますか。 パラメーターでは、文字列、ブール値、整数、オブジェクトなど、どの型の値でも受け入れますか。
  • パラメーターを既定値に依存させることはできますか。 値を完全に省略し、代わりに既定値に依存させることはできますか。
  • ユーザー エクスペリエンスをさらに向上させることはできますか。 ヘルプ メッセージを提供して、ユーザーにさらにわかりやすくすることはできますか。

アプローチを選択する

既定では、すべてのパラメーターは省略可能です。 この既定値はいくつかの場合で機能しますが、ユーザーにパラメーター値を指定させる必要があり、値が適切なものである必要がある場合があります。 ユーザーがパラメーターに値を指定していない場合は、スクリプトを終了するか、問題の解決方法をユーザーに通知する必要があります。 最悪のシナリオは、スクリプトが続行し、実行させたくない処理が行われることです。

スクリプトの安全性を高めるために使用できるアプローチがいくつかあります。 カスタム コードを記述して、パラメーター値を調べることができます。 または、ほぼ同じことを行うデコレーターを使用することもできます。 両方のアプローチを見てみましょう。

  • If/Elseを使用しますIf/Else コンストラクトでは、パラメーターの値を確認してから、処理内容を決定できます。 次に例を示します。

    Param(
       $Path
    )
    If (-Not $Path -eq '') {
       New-Item $Path
       Write-Host "File created at path $Path"
    } Else {
       Write-Error "Path cannot be empty"
    } 
    

    Write-Error の値を指定しない場合、スクリプトにより $Path が実行されます。

  • Parameter[]デコレーターを使用します。 必要な入力回数が少ないより優れた方法は、Parameter[] デコレーターを使用することです。

    Param(
       [Parameter(Mandatory)]
       $Path
    )
    New-Item $Path
    Write-Host "File created at path $Path"
    

    このスクリプトを実行し、$Path の値を省略した場合、値の入力を求めるダイアログが表示されます。

    cmdlet CreateFile.ps1 at command pipeline position 1
    Supply values for the following parameters:
    Path:
    

    スクリプトの実行時にユーザーに表示されるヘルプ メッセージを提供して、このデコレーターを改善できます。

    [Parameter(Mandatory, HelpMessage = "Please provide a valid path")]
    

    このスクリプトを実行すると、詳細情報については「!?」と入力するように求めるメッセージが表示されます。

    cmdlet CreateFile.ps1 at command pipeline position 1
    Supply values for the following parameters:
    (Type !? for Help.)
    Path: !?  # You type !?
    Please provide a valid path  # Your Help message.
    
  • 型を割り当てます。 パラメーターに型を割り当てると、たとえば、パラメーターがブール値ではなく文字列のみを受け入れるように指定できます。 このようにしてユーザーは何が予想されるかわかります。 パラメーターに型を割り当てるには、角かっこで囲んだ型をパラメーターの前に置きます。

    Param(
       [string]$Path
    )
    

これら 3 つのアプローチは相互に排他的ではありません。 これらを組み合わせて、スクリプトの安全性を高めることができます。