about_Script_Blocks
簡単な説明
スクリプト ブロックとは何かを定義し、PowerShell プログラミング言語でスクリプト ブロックを使用する方法について説明します。
長い説明
PowerShell プログラミング言語では、スクリプト ブロックは、1 つのユニットとして使用できるステートメントまたは式のコレクションです。 スクリプト ブロックは引数を受け取り、値を返すことができます。
構文上、スクリプト ブロックは、次の構文に示すように、中かっこのステートメント リストです。
{<statement list>}
スクリプト ブロックは、スクリプト ブロック内のすべてのコマンドの出力を 1 つのオブジェクトまたは配列として返します。
キーワードを使用して戻り値を return
指定することもできます。 キーワードは return
、スクリプト ブロックから返される他の出力には影響しません。 ただし、 キーワードはその return
行でスクリプト ブロックを終了します。 詳細については、「 about_Return」を参照してください。
関数と同様に、スクリプト ブロックにはパラメーターを含めることができます。 次の構文に示すように、Param キーワードを使用して名前付きパラメーターを割り当てます。
{
Param([type]$Parameter1 [,[type]$Parameter2])
<statement list>
}
注意
スクリプト ブロックでは、関数とは異なり、中かっこの外側でパラメーターを指定することはできません。
関数と同様に、スクリプト ブロックには、、Begin
、Process
、および キーワードをDynamicParam
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
使用して パラメーター と $p2
を作成します$p1
。 文字列 "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」を参照してください。
遅延バインド スクリプト ブロックとパラメーターの使用
パイプライン入力を受け入れる型指定されたパラメーターを使用すると、 パラメーターで 遅延バインド スクリプト ブロックを使用できます。 遅延バインド スクリプト ブロックを短縮形として使用して、パイプラインコマンドレットを実行する前にパラメーターを定義できます。
遅延バインド スクリプト ブロック内では、パイプライン変数 $_
を使用して、パイプされた オブジェクトを参照できます。
# 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 つを再利用して、他のパラメーターを設定できます。
遅延バインド スクリプト ブロックのパラメーターとしての注意事項:
遅延バインド スクリプト ブロックで使用するパラメーター名を明示的に指定する必要があります。
パラメーターは型指定しないでください。また、パラメーターの型を または
[object]
に[scriptblock]
することはできません。パイプライン入力を指定せずに遅延バインド スクリプト ブロックを使用すると、エラーが発生します。
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