ja-JP/about_Script_Blocks.help.txt

TOPIC
    about_Script_Blocks

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

詳細な説明
    PowerShell プログラミング言語において、スクリプトブロックは 1 つの単位
    として扱えるステートメントや式の集まりです。ステートメントの集まりは
    波かっこ ({}) で囲むか、関数として定義するか、スクリプトファイルに保存
    できます。スクリプトブロックは値を返したり、パラメーターや引数を受け取ったり
    できます。スクリプトブロックは変数用に新しいスコープを作成します。

    構文的には、スクリプトブロックは次の構文に示すように波かっこで囲んだ
    ステートメント一覧です。

    {<statement list>}

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

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

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

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

    関数と同様に、スクリプトブロックには dynamicparam ステートメント、および
    begin、process、end ステートメントを含められます。詳しくは
    about_Functions と about_Functions_Advanced を参照してください。

    重要: 波かっこで囲まれたブロックがすべてスクリプトブロックであるわけでは
    ありません。たとえば for ループや if ステートメント内のコマンドは
    ステートメントブロックで囲まれています。ステートメントブロックは変数用の
    新しいスコープを作成せず、他のステートメントキーワードのパラメーターも
    サポートしません。

スクリプトブロックの使用

    スクリプトブロックは、.NET Framework 型
    System.Management.Automation.ScriptBlock のインスタンスです。コマンドは
    スクリプトブロックをパラメーター値として持てます。たとえば Invoke-Command
    コマンドレットには、スクリプトブロック値を受け取る ScriptBlock パラメーターが
    あります。

    Invoke-Command -ScriptBlock { Get-Process }

    Invoke-Command は、パラメーターブロックを持つスクリプトブロックも実行できます。
    パラメーターは ArgumentList パラメーターを使って位置によって割り当てられます。

    Invoke-Command -ScriptBlock { param($p1, $p2)
    "p1: $p1"
    "p2: $p2"
    } -ArgumentList "First", "Second"

    上の例のスクリプトブロックは、param キーワードを使ってパラメーター $p1 と
    $p2 を作成します。文字列 "First" は最初のパラメーター ($p1) に、"Second"
    は ($p2) にバインドされます。

    ArgumentList の動作について詳しくは、about_Splatting を参照してください。

    変数を使ってスクリプトブロックを格納し、実行できます。次の例は、スクリプト
    ブロックを変数に格納し、それを Invoke-Command に渡します。

    $a = { Get-Service BITS }
    Invoke-Command -ScriptBlock $a

    呼び出し演算子は、変数に格納されたスクリプトブロックを実行するもう 1 つの
    方法です。Invoke-Command と同様に、呼び出し演算子はスクリプトブロックを
    子スコープで実行します。呼び出し演算子を使うと、スクリプトブロックで
    パラメーターを使いやすくなります。

    $a ={ param($p1, $p2)
    "p1: $p1"
    "p2: $p2"
    }
    &$a -p2 "First" -p1 "Second"

    代入を使って、スクリプトブロックの出力を変数に格納できます。

    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) スクリプトブロックを使用できます。遅延バインド
    スクリプトブロックは、パイプライン処理されるコマンドレットを実行する前に
    そのパラメーターを定義する簡略表記として使えます。

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

    # どちらの例も config.log を old_config.log にリネームします
    # 遅延バインドなし
    dir config.log | ForEach-Object -Process {
      Rename-Item -Path $_ -NewName "old_$($_.Name)"
    }
    # 遅延バインドあり
    dir config.log | Rename-Item -NewName { "old_$($_.Name)" }

    より複雑なコマンドレットでは、遅延バインドスクリプトブロックを使うと、
    パイプで渡された 1 つのオブジェクトを再利用して他のパラメーターを設定
    できます。

    パラメーターとしての遅延バインドスクリプトブロックに関する注意:

    - 遅延バインドスクリプトブロックと共に使うパラメーター名は、明示的に
      指定する必要があります。
    - パラメーターは型指定されていなければならず、その型は [scriptblock] や
      [Object] であってはなりません。
    - パイプライン入力を与えずに遅延バインドスクリプトブロックを使うと、エラーが
      発生します。

      Rename-Item -NewName {$_.Name + ".old"}

関連項目
    about_Functions
    about_Functions_Advanced
    about_Operators

----
原文: PowerShell-Docs (CC BY 4.0) の翻訳 / PSHelpJaJP