Windows PowerShell: パラメーターを定義する

Windows PowerShell には、パラメーターを定義する単純な方法と複雑な方法がありますが、どちらの方法にもメリットがあります。

Don Jones

IT 担当者は、なんらかの入力値を必要とするスクリプトや関数を頻繁に記述します。たとえば、コンピューター名やファイル パスなどが入力値となります。Windows PowerShell に指示して、このようなパラメーターを受け取り、コマンド ラインからパラメーターを収集し、その値をスクリプトや関数で使用している変数に格納すると、簡単かつ効率的に入力を処理できます。

知っておく必要があるのは、パラメーターの宣言方法だけです。最も単純な方法は、次のように Param ブロックを使用する方法です。

Param(
  [string]$computerName,
  [string]$filePath
)

上記の例のように、コードを複数行に分けて記述する必要はなく、1 行に記述して、まとめて実行できます。しかし、私は、読みやすさを考慮して改行するようにしています。Param ブロックがスクリプト ファイルまたは関数内のコードの先頭に配置されていると、Windows PowerShell では、Param ブロックを読み取って、スクリプトや関数の実行時にパラメーター名をタブ補完することもできます。使用するパラメーター名には気を使っています。この例では、–computerName と –filePath がパラメーター名です。これらのパラメーターは、他の Windows PowerShell コマンドレットで同じような情報を処理する際に使用するパラメーター名と似ています。このようにすると、自分で宣言したパラメーターと Windows PowerShell の既存のパラメーターとの一貫性を保つことができます。

この Param ブロックを Get-Something.ps1 というスクリプトで使用する場合は、次のようにパラメーターを使用します。

./Get-Something –computerName SERVER1 –filePath C:\Whatever

パラメーター名を短縮することもできます。名前を短縮すると入力文字数が減りますが、動作は変わりません。

./Get-Something –comp SERVER1 –file C:\Whatever

パラメーター名を完全に省略することも可能です。Windows PowerShell では、位置に基づいて自動的に値を受け取るので、スクリプト ファイルに記述されているのと同じ順番になるように、注意してパラメーターの値を指定する必要があります。

./Get-Something SERVER1 C:\Whatever

もちろん、パラメーター名を使用すると、人間にとってコマンドが理解しやすくなります。また、パラメーターを任意の順番で記述できるというメリットもあります。

./Get-Something –filePath C:\Whatever –computerName SERVER1

Windows PowerShell では、より複雑な方法でパラメーターを宣言することができます。この本格的な構文を使用すると、パラメーターを必須項目として定義する、位置を指定する (指定しない場合には、パラメーター名を必ず指定する必要があります) など、さまざまなことが可能になります。この拡張構文も、スクリプトと関数の両方で使用できます。

[CmdletBinding()]
Param(
  [Parameter(Mandatory=$True,Position=1)]
   [string]$computerName,
	
   [Parameter(Mandatory=$True)]
   [string]$filePath
)

このコードも、1 行にまとめて実行できますが、読みやすさを考慮して改行しています。両方のパラメーターに、[Parameter()] というデコレータを使用し、両方のパラメーターを必須項目として定義しました。

このスクリプトの実行時に、これらのパラメーターのいずれかまたは両方を入力していない場合は、パラメーターの入力を求めるメッセージが自動的に表示されます。パラメーターの入力を促すメッセージを表示するために追加で記述が必要なコードはありません。また、–computerName を最初の位置に来るパラメーターとして定義していますが、–filePath は位置を定義していないためパラメーター名を指定する必要があります。

[CmdletBinding()] というディレクティブを使用すると、他にもいくつかのメリットがあります。その 1 つは、–Verbose や –Debug などの Windows PowerShell のすべての共通パラメーターをスクリプトや関数で使用できることです。[CmdletBinding()] と記述したことで、スクリプトや関数で、Write-Verbose コマンドレットと Write-Debug コマンドレットが使用できるようになり、これらのコマンドレットの出力は自動的に抑制されます。

–Verbose や –Debug を含むスクリプトや関数を実行すると、それぞれのパラメーターに対応する Write-Verbose コマンドレットや Write-Debug が魔法のようにアクティブになります。これはスクリプトで段階的な進捗情報を生成 (Write-Verbose) したり、デバッグ用のブレークポイントを追加 (Write-Debug) したりするのに優れた方法です。

現時点では、どちらのパラメーターも、1 つの値しか受け取りません。これらのパラメーターを [string[]] として宣言すると、値のコレクション全体を受け取れるようになります。次に、Foreach ループを使用してコレクションの値を列挙して、一度に 1 つの値を処理できます。

もう 1 つの便利なパラメーターの種類は [switch] です。

Param([switch]$DoSomething)

上記のように記述すると、–DoSomething パラメーターが含まれないスクリプトや関数を実行したとき、変数 $DoSomething に $False が内部で設定されます。–DoSomething パラメーターを含むスクリプトを実行すると、$DoSomething 変数には $True が設定されます。パラメーターに値を渡す必要はありません。Windows PowerShell では、特定のパラメーターが含まれていれば、変数に $True が設定されます。以上が、スイッチ パラメーター (たとえば、Get-ChildItem コマンドレットの –recurse パラメーター) の動作です。

どのパラメーターも独立したエンティティで、次のパラメーターとはコンマで区切られています。先ほど挙げた例で確認します。

[CmdletBinding()]
Param(
  [Parameter(Mandatory=$True,Position=1)]
   [string]$computerName,
	
   [Parameter(Mandatory=$True)]
   [string]$filePath
)

[Parameter()] デコレータを含む –computerName パラメーター全体の後に、コンマがあります。このコンマは、最初のパラメーターの記述が終わり、次のパラメーターの記述に移ることを示しています。コンマの後の記述は、すべて –filePath パラメーターに関連しています。3 つ目のパラメーターを記述する場合は、さらにコンマを追加します。

[CmdletBinding()]
Param(
  [Parameter(Mandatory=$True,Position=1)]
   [string]$computerName,
	
   [Parameter(Mandatory=$True)]
   [string]$filePath,

   [switch]$DoSomething
)

上記の例では、パラメーターはすべて Param ブロックに含まれています。すべてのパラメーターに [Parameter()] デコレータを使用する必要はなく、パラメーターを必須にしたり、パラメーターのパイプライン入力を許可したり、パラメーターの位置を指定したりするなど、何かを宣言する必要がある場合にのみ使用します。このように宣言できる他の属性の詳細については、Windows PowerShell で「help about_functions_advanced_parameters」コマンドを実行してください。

関数やスクリプトは、パラメーターからの入力のみを受け取るように記述することをお勧めします。このようにすると、関数やスクリプトは、より自己完結的な状態になり、文書化が簡単になり、シェルの他の動作方法との一貫性を高めることができます。

Don Jones

Don Jones は、Microsoft MVP の受賞者で、『Learn Windows PowerShell in a Month of Lunches』(Manning Publications、2011 年) の著者でもあります。この書籍は、管理者が Windows PowerShell を効率的に使用できるようにすることを目的としています。また、一般ユーザーを対象にオンサイトの Windows PowerShell トレーニングも開催しています。Don に対するお問い合わせについては、ConcentratedTech.com (英語) または bit.ly/AskDon (英語) を参照してください。

関連コンテンツ