次の方法で共有


about_Script_Blocks

簡単な説明

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

詳細な説明

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

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

{<statement list>}

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

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

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

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

Note

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

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

関連項目