Share via


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>
}

注意

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

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

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

パラメーターで遅延バインド スクリプト ブロックを使用する

パイプライン入力 () またはby PropertyName (by Value) を受け入れる型指定されたパラメーターを使用すると、 パラメーターで遅延バインド スクリプト ブロックを使用できます。 遅延バインド スクリプト ブロック内では、パイプライン変数 $_を使用して、 オブジェクトでパイプ処理された を参照できます。

# Renames config.log to old_config.log
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
    

こちらもご覧ください