簡短描述
描述如何使用散佈技術在 PowerShell 中將參數傳遞至命令。
長描述
[本主題由密西西比州格爾夫波特的 Rohn Edwards 提供,他是一名系統管理員,也是 2012 年腳本遊戲高級組的獲勝者。 針對 Windows PowerShell 3.0 進行了修訂。
展開是一種將參數值集合作為 unit 傳遞給命令的方法。 PowerShell 會將集合中的每個值與命令參數產生關聯。 Splatted 參數值會儲存在具名 splatting 變數中,其看起來像標準變數,但以 At 符號 (@) 開頭,而不是貨幣符號 ($)。 At 符號會告知 PowerShell 您傳遞值的集合,而不是單一值。
展開可讓您的命令更短且更容易閱讀。 您可以在不同的命令調用中重複使用展開值,並使用展開將參數值從 $PSBoundParameters automatic 變數傳遞到其他腳本和函數。
從 Windows PowerShell 3.0 開始,您也可以使用曲線來代表命令的所有參數。
語法
<CommandName> <optional parameters> @<HashTable> <optional parameters>
<CommandName> <optional parameters> @<Array> <optional parameters>
若要提供位置參數的參數值而不需要使用參數名稱,請使用陣列語法。 若要提供參數名稱和值組,請使用哈希表語法。 Splatted 值可以出現在參數清單中的任何位置。
展開時,您不需要使用哈希表或陣列來傳遞所有參數。 您可以使用展開方式傳遞一些參數,並依位置或參數名稱傳遞其他參數。 此外,您可以在單個命令中展開多個物件,以便為每個參數傳遞不超過一個值。
使用哈希表進行展開
使用哈希表來展開參數名稱和值配對。 您可以將此格式用於所有參數類型,包括位置參數和開關參數。 位置參數必須依名稱指派。
下列範例會比較將 Test.txt 檔案複製到相同目錄中 Test2.txt 檔案的兩個 Copy-Item 命令。
第一個範例會使用包含參數名稱的傳統格式。
Copy-Item -Path "test.txt" -Destination "test2.txt" -WhatIf
第二個範例使用哈希表展開。 第一個命令會建立參數名稱與參數值組的哈希表,並將它儲存在 $HashArguments 變數中。 第二個命令會使用命令中的 $HashArguments 變數搭配 splatting。 At 符號 (@HashArguments) 取代命令中的貨幣符號 ($HashArguments)。
要為 WhatIf 開關參數提供值,請使用 $True 或 $False。
$HashArguments = @{
Path = "test.txt"
Destination = "test2.txt"
WhatIf = $true
}
Copy-Item @HashArguments
注: 在第一個命令中,At 符號 (@) 表示哈希表,而不是展開值。 PowerShell 中哈希表的語法為:@{\<name\>=\<value\>; \<name\>=\<value\>; ...}*
使用陣列展開
使用陣列來分割位置參數的值,而不需要參數名稱。 這些值必須在陣列中以位置編號順序排列。
下列範例會比較將 Test.txt 檔案複製到相同目錄中 Test2.txt 檔案的兩個 Copy-Item 命令。
第一個範例會使用省略參數名稱的傳統格式。 參數值會依命令的位置順序顯示。
Copy-Item "test.txt" "test2.txt" -WhatIf
第二個範例使用陣列展開。 第一個命令會建立參數值的陣列,並將其儲存在 $ArrayArguments 變數中。 這些值會依陣列中的位置順序排列。 第二個命令會在展開的命令中使用 $ArrayArguments 變數。 At 符號 (@ArrayArguments) 取代命令中的貨幣符號 ($ArrayArguments)。
$ArrayArguments = "test.txt", "test2.txt"
Copy-Item @ArrayArguments -WhatIf
例子
此示例說明如何在不同的命令中重用展開的值。 此範例中的命令會使用 Write-Host Cmdlet 將訊息寫入主機程式控制台。 它會使用潑灑技術來指定前景和背景色彩。
若要變更所有命令的色彩,只要變更 $Colors 變數的值即可。
第一個命令會建立參數名稱和值的哈希表,並將哈希表儲存在 $Colors 變數中。
$Colors = @{ForegroundColor = "black"; BackgroundColor = "white"}
第二個和第三個命令會使用 $Colors 變數在 Write-Host 命令中展開。 若要使用 $Colors variable,請將美元符號($Colors)取代為 At 符號(@Colors)。
#Write a message with the colors in $Colors
Write-Host "This is a test." @Colors
#Write second message with same colors. The position of splatted
#hash table does not matter.
Write-Host @Colors "This is another test."
此示例說明如何使用展開和 $PSBoundParameters automatic 變數將其參數轉發到其他命令。
$PSBoundParameters 自動變數是字典物件 (System.Collections.Generic.Dictionary),其中包含腳本或函式執行時所使用的所有參數名稱和值。
在下列範例中,我們使用 $PSBoundParameters 變數,將傳遞至腳本或函式的參數值從 Test2 函式轉送至 Test1 函式。 從 Test1 兩次呼叫 Test2 函式時,皆會使用分散運算。
function Test1
{
param($a, $b, $c)
$a
$b
$c
}
function Test2
{
param($a, $b, $c)
#Call the Test1 function with $a, $b, and $c.
Test1 @PsBoundParameters
#Call the Test1 function with $b and $c, but not with $a
$LimitedParameters = $PSBoundParameters
$LimitedParameters.Remove("a") | Out-Null
Test1 @LimitedParameters
}
Test2 -a 1 -b 2 -c 3
1
2
3
2
3
展開命令參數
您可以使用曲線來代表命令的參數。 當您建立 Proxy 函式,也就是呼叫另一個命令的函式時,這項技術很有用。 這項功能是在 Windows PowerShell 3.0 中引進的。
若要將命令的參數展開,請使用 @Args 來表示命令參數。 這項技術比列舉命令參數更容易,即使所呼叫命令的參數變更,它仍可運作,而不會進行修訂。
此功能會使用 $Args 自動變數,其中包含所有未指派的參數值。
例如,下列函式會呼叫 Get-Process Cmdlet。 在此函式中,@Args 代表 Get-Process Cmdlet 的所有參數。
function Get-MyProcess { Get-Process @Args }
當您使用 Get-MyProcess 函式時,所有未指派的參數和參數值都會傳遞至 @Args,如下列命令所示。
Get-MyProcess -Name PowerShell
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
463 46 225484 237196 719 15.86 3228 powershell
Get-MyProcess -Name PowerShell_Ise -FileVersionInfo
ProductVersion FileVersion FileName
-------------- ----------- --------
6.2.9200.16384 6.2.9200.1638... C:\Windows\system32\WindowsPowerShell\...
您可以在已明確宣告參數的函式中使用 @Args。 您可以在函式中多次使用它,但您輸入的所有參數都會傳遞至 @Args的所有實例,如下列範例所示。
function Get-MyCommand
{
Param ([switch]$P, [switch]$C)
if ($P) { Get-Process @Args }
if ($C) { Get-Command @Args }
}
Get-MyCommand -P -C -Name PowerShell
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
408 28 75568 83176 620 1.33 1692 powershell
Path : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.e
Extension : .exe
Definition : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.e
Visibility : Public
OutputType : {System.String}
Name : powershell.exe
CommandType : Application
ModuleName :
Module :
RemotingCapability : PowerShell
Parameters :
ParameterSets :
HelpUri :
FileVersionInfo : File: C:\Windows\System32\WindowsPowerShell
\v1.0\powershell.exe
InternalName: POWERSHELL
OriginalFilename: PowerShell.EXE.MUI
FileVersion: 10.0.14393.0 (rs1_release.160715-1616
FileDescription: Windows PowerShell
Product: Microsoft Windows Operating System
ProductVersion: 10.0.14393.0
Debug: False
Patched: False
PreRelease: False
PrivateBuild: False
SpecialBuild: False
Language: English (United States)
筆記
PowerShell 期望狀態配置(DSC)不是為了使用參數展開而設計的。 您無法使用 Splatting 將值傳遞至 DSC 資源。 如需詳細資訊,請參閱 Gael Colas 一文 Pseudo-Splatting DSC 資源。