about_Script_Blocks

簡単な説明

スクリプト ブロックとは何かを定義し、PowerShell プログラミング言語でスクリプト ブロックを使用する方法について説明します。

詳細な説明

PowerShell プログラミング言語では、スクリプト ブロックは、1 つのユニットとして使用できるステートメントまたは式のコレクションです。 ステートメントのコレクションは、中かっこ ({}) で囲んだり、関数として定義したり、スクリプト ファイルに保存したりできます。 スクリプト ブロックは値を返し、パラメーターと引数を受け取ることができます。

構文上、スクリプト ブロックは、次の構文に示すように、中かっこ内のステートメント リストです。

{<statement list>}

スクリプト ブロックは、1 つのオブジェクトまたは配列として、スクリプト ブロック内のすべてのコマンドの出力を返します。

キーワード (keyword)を使用して戻り値をreturn指定することもできます。 キーワード (keyword)はreturn、スクリプト ブロックから返される他の出力には影響しません。 ただし、returnキーワード (keyword)はその行でスクリプト ブロックを終了します。 詳細については、「about_Return」を参照してください

関数と同様に、スクリプト ブロックにはパラメーターを含めることができます。 次の構文に示すように、パラメーター キーワード (keyword)を使用して名前付きパラメーターを割り当てます。

{
    Param([type]$Parameter1 [,[type]$Parameter2])
    <statement list>
}

Note

スクリプト ブロックでは、関数とは異なり、中かっこの外側でパラメーターを指定することはできません。

関数と同様に、スクリプト ブロックには 、、、キーワード (keyword)Endを含DynamicParamProcessめることができます。 Begin 詳細については、「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

前の例のスクリプト ブロックでは、キーワード (keyword)を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を参照してください

遅延バインド スクリプト ブロックとパラメーターの使用

パイプライン入力を受け入れる型指定されたパラメーターを使用すると、パラメーターで 遅延バインド スクリプト ブロックを使用できます。 遅延バインド スクリプト ブロックを短縮形として使用して、パイプラインコマンドレットを実行する前にパラメーターを定義できます。

遅延バインド スクリプト ブロック内では、パイプライン変数 $_を使用して、パイプされたオブジェクトを参照できます。

# 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
    

関連項目