about_Script_Blocks
簡単な説明
スクリプト ブロックとは何かを定義し、PowerShell プログラミング言語でスクリプト ブロックを使用する方法について説明します。
詳細な説明
PowerShell プログラミング言語では、スクリプト ブロックは、1 つのユニットとして使用できるステートメントまたは式のコレクションです。 ステートメントのコレクションは、中かっこ ({}
) で囲んだり、関数として定義したり、スクリプト ファイルに保存したりできます。 スクリプト ブロックは値を返し、パラメーターと引数を受け取ることができます。
構文上、スクリプト ブロックは、次の構文に示すように、中かっこ内のステートメント リストです。
{<statement list>}
スクリプト ブロックは、1 つのオブジェクトまたは配列として、スクリプト ブロック内のすべてのコマンドの出力を返します。
return
キーワードを使用して戻り値を指定することもできます。 return
キーワードは、スクリプト ブロックから返される他の出力には影響しません。 ただし、 return
キーワードは、その行のスクリプト ブロックを終了します。 詳細については、「 about_Return」を参照してください。
関数と同様に、スクリプト ブロックにはパラメーターを含めることができます。 次の構文に示すように、Param キーワードを使用して名前付きパラメーターを割り当てます。
{
Param([type]$Parameter1 [,[type]$Parameter2])
<statement list>
}
Note
スクリプト ブロックでは、関数とは異なり、中かっこの外側でパラメーターを指定することはできません。
関数と同様に、スクリプト ブロックには、 DynamicParam
、 Begin
、 Process
、および End
キーワードを含めることができます。 詳細については、「 about_Functions と about_Functions_Advanced」を参照してください。
スクリプト ブロックの使用
スクリプト ブロックは、Microsoft .NET Framework 型の System.Management.Automation.ScriptBlock
のインスタンスです。 コマンドには、スクリプト ブロック パラメーター値を指定できます。 たとえば、次の例に示すように、 Invoke-Command
コマンドレットにはスクリプト ブロック値を受け取る ScriptBlock
パラメーターがあります。
Invoke-Command -ScriptBlock { Get-Process }
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
999 28 39100 45020 262 15.88 1844 communicator
721 28 32696 36536 222 20.84 4028 explorer
...
Invoke-Command
では、パラメーター ブロックを持つスクリプト ブロックを実行することもできます。
パラメーターは、 ArgumentList パラメーターを使用して位置によって割り当てられます。
Invoke-Command -ScriptBlock { param($p1, $p2)
"p1: $p1"
"p2: $p2"
} -ArgumentList "First", "Second"
p1: First
p2: Second
前の例のスクリプト ブロックでは、 param
キーワードを使用して、パラメーターの $p1
と $p2
を作成します。 文字列 "First" は最初のパラメーター ($p1
) にバインドされ、"Second" は ($p2
) にバインドされます。
ArgumentList の動作の詳細については、about_Splattingを参照してください。
変数を使用して、スクリプト ブロックを格納および実行できます。 次の例では、スクリプト ブロックを変数に格納し、 Invoke-Command
に渡します。
$a = { Get-Service BITS }
Invoke-Command -ScriptBlock $a
Status Name DisplayName
------ ---- -----------
Running BITS Background Intelligent Transfer Ser...
呼び出し演算子は、変数に格納されているスクリプト ブロックを実行するもう 1 つの方法です。
Invoke-Command
と同様に、呼び出し演算子は子スコープでスクリプト ブロックを実行します。 呼び出し演算子を使用すると、スクリプト ブロックでパラメーターを簡単に使用できます。
$a ={ param($p1, $p2)
"p1: $p1"
"p2: $p2"
}
&$a -p2 "First" -p1 "Second"
p1: Second
p2: First
代入を使用して、スクリプト ブロックからの出力を変数に格納できます。
PS> $a = { 1 + 1}
PS> $b = &$a
PS> $b
2
PS> $a = { 1 + 1}
PS> $b = Invoke-Command $a
PS> $b
2
呼び出し演算子の詳細については、 about_Operatorsを参照してください。
遅延バインド スクリプト ブロックとパラメーターの使用
パイプライン入力を受け入れる型指定されたパラメーターを使用すると、パラメーター delay-bind スクリプト ブロックを使用できます。 遅延バインド スクリプト ブロックを短縮形として使用して、パイプラインコマンドレットを実行する前にパラメーターを定義できます。
遅延バインド スクリプト ブロック内では、パイプライン変数 $_
を使用して、パイプされたオブジェクトを参照できます。
# Both examples rename config.log to old_config.log
# Without delay-binding
dir config.log | ForEach-Object -Process {
Rename-Item -Path $_ -NewName "old_$($_.Name)"
}
# With delay-binding
dir config.log | Rename-Item -NewName { "old_$($_.Name)" }
より複雑なコマンドレットでは、遅延バインド スクリプト ブロックを使用すると、パイプされた 1 つのオブジェクトを再利用して他のパラメーターを設定できます。
パラメーターとしての遅延バインド スクリプト ブロックに関する注意事項:
遅延バインド スクリプト ブロックで使用するパラメーター名を明示的に指定する必要があります。
パラメーターは型指定しないでください。また、パラメーターの型を
[scriptblock]
または[object]
することはできません。パイプライン入力を指定せずに遅延バインド スクリプト ブロックを使用すると、エラーが発生します。
Rename-Item -NewName {$_.Name + ".old"}
Rename-Item : Cannot evaluate parameter 'NewName' because its argument is specified as a script block and there is no input. A script block cannot be evaluated without input. At line:1 char:23 + Rename-Item -NewName {$_.Name + ".old"} + ~~~~~~~~~~~~~~~~~~ + CategoryInfo : MetadataError: (:) [Rename-Item], ParameterBindingException + FullyQualifiedErrorId : ScriptBlockArgumentNoInput, Microsoft.PowerShell.Commands.RenameItemCommand
関連項目
PowerShell