共用方式為


about_Script_Blocks

簡短描述

定義腳本區塊是什麼,並說明如何在PowerShell程式設計語言中使用腳本區塊。

完整描述

在PowerShell程式設計語言中,腳本區塊是語句或表達式的集合,可用來做為單一單位。 語句的集合可以括在大括號 () {} 、定義為函式或儲存在腳本檔案中。 腳本區塊可以傳回值,並接受參數和自變數。

語法上,腳本區塊是大括弧中的語句清單,如下列語法所示:

{<statement list>}

腳本區塊會傳回腳本區塊中所有命令的輸出,可以是單一對象或陣列。

您也可以使用 return 關鍵詞來指定傳回值。 關鍵詞 return 不會影響或隱藏腳本區塊傳回的其他輸出。 不過, return 關鍵詞會在該行結束腳本區塊。 如需詳細資訊,請參閱 about_Return

如同函式,腳本區塊可以包含參數。 使用 Param 關鍵詞來指派具名參數,如下列語法所示:

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

注意

在腳本區塊中,不同於函式,您無法在大括弧之外指定參數。

如同函式,腳本區塊可以包含 DynamicParamBeginProcessEnd 關鍵詞。 如需詳細資訊,請參閱 about_Functionsabout_Functions_Advanced

使用腳本區塊

腳本區塊是 Microsoft .NET Framework 類型的System.Management.Automation.ScriptBlock實例。 命令可以有腳本區塊參數值。 例如, Invoke-Command Cmdlet 具有採用 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...

呼叫運算符是執行儲存在變數中的腳本區塊的另一種方式。 如同 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

搭配參數使用延遲系結腳本區塊

接受管線輸入的具型別參數可讓您在 參數上使用 延遲系結 腳本區塊。 您可以先使用延遲系結腳本區塊做為速記來定義管線 Cmdlet 的參數,再執行它。

在延遲系結腳本區塊內,您可以使用管線變數 $_參考物件中的管線。

# 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)" }

在更複雜的 Cmdlet 中,延遲系結腳本區塊允許重複使用物件中的一個管線來填入其他參數。

延遲系結腳本區塊做為參數的注意事項:

  • 您必須明確指定搭配延遲系結腳本區塊使用的任何參數名稱。

  • 參數不得為不具型別,且參數的類型不可為 [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
    

另請參閱