PowerShell 函式引數
- 定義 PowerShell 函式引數
- PowerShell 函式中的命名引數
- PowerShell 函式中的位置引數
- PowerShell 函式中的開關引數
- 在 PowerShell 函式引數中的 splatting
- PowerShell 引數屬性
- 具有命名引數語法的高階函式
PowerShell 函式引數通過利用特性和引數來限制使用者輸入特定值,從而使函式更加強大。它新增了一些規則和驗證,以防止編寫大量指令碼,並且它們易於使用。
一旦指定了函式引數,也可以通過命令列給出引數。命名、位置、開關和動態引數都是函式引數的示例。函式引數也可用於將基本函式轉換為更復雜的函式。
定義 PowerShell 函式引數
引數定義如下。
param(
$Parameter1
)
最佳實踐建議向引數新增型別並插入 Parameter()
塊,以確保引數僅採用你需要的輸入型別,並在未來啟用更多功能。因此,它如下所示完成。
param(
[Parameter()]
[string]$Parameter1
)
甚至可以將附加引數新增到上述語法中,如下所示。
param(
[Parameter()]
[string]$Param1,
[Parameter()]
[string]$Param2
)
Write-Host "Param1 value is $Param1"
Write-Host "Param 2 value is $Param2"
PowerShell 函式中的命名引數
命名引數是在指令碼中使用 PowerShell 函式引數的一種技術。使用命名引數呼叫指令碼或函式時,使用引數的完整名稱。
假設上述 PowerShell 指令碼儲存在 test.ps1
中。在這裡,我們將為 param1 和 param2 提供值;你可以在下面的示例中注意到應該傳遞引數的全名。
./test.ps1 -Param1 'value' -Param2 'valuenext'
輸出:
執行此指令碼時,你會看到類似這樣的內容,其中每個引數變數都替換為執行時提供的值。
PowerShell 函式中的位置引數
通過位置而不是名稱傳遞專案是利用引數的另一種方式。通過位置傳遞引數值時,不使用引數的名稱。相反,PowerShell 將每個引數的值與其在函式中的位置進行比較。PowerShell 識別出程式碼中的 Param1 是在 Param2 之前指定的,並以正確的順序匹配這些值。
./test.ps1 'value' 'valuenext'
輸出
Param1 value value
Param 2 value is valuenext
在上面的示例中,param1 和 param2 都被宣告為字串型別,但它不是你可以使用的唯一型別。可以使用 .NET 類庫中的任何型別。
除了原始順序之外,我們還可以通過在引數構造中給出位置來繼續前進。如下所示。
param(
[Parameter(position = 1)]
[string]$Param1,
[Parameter(position = 0)]
[string]$Param2
)
Write-Host "Param1 value is $Param1"
Write-Host "Param 2 value is $Param2"
在這裡,你可以看到引數的順序發生了變化。
./test.ps1 'param2' 'param1'
PowerShell 函式中的開關引數
此引數用於使用二進位制或布林值表示某物是開啟還是關閉。switch
型別用於指定它。繼續上面的例子,我們將新增另一個名為 DisplayParam2
的開關引數。
param(
[Parameter()]
[string]$Param1,
[Parameter()]
[string]$Param2,
[Parameter()]
[switch]$DisplayParam2
)
Write-Host "Param1 value is $Param1"
if ($DisplayParam2.IsPresent) {
Write-Host "Param2 value is $Param2"
}
輸出:
在 PowerShell 函式引數中的 splatting
splatting 主要用於引數很多的時候。在執行命令之前為指令碼設定引數稱為 splatting。到目前為止,你一直在執行時定義引數並將值傳遞給引數。一旦你有一組出現在下面的引數,這可能是一個問題。
param(
[Parameter()]
[string]$Param1,
[Parameter()]
[string]$Param2,
[Parameter()]
[switch]$DisplayParam2,
[Parameter()]
[string]$Param3,
[Parameter()]
[string]$Param4,
[Parameter()]
[string]$Param5,
[Parameter()]
[string]$Param6,
[Parameter()]
[string]$Param7
)
Write-Host "Param1 value is $Param1"
if ($DisplayParam2.IsPresent) {
Write-Host "Param2 value is $Param2"
}
Write-Host "Param3 value is $Param3"
Write-Host "Param4 value is $Param4"
Write-Host "Param5 value is $Param5"
Write-Host "Param6 value is $Param6"
Write-Host "Param7 value is $Param7"
你可以使用雜湊表在單獨的階段指定引數值,而不是向右滑動,如下圖所示。引數值可以整齊地對齊,從而更容易理解正在使用的引數值。
建立雜湊表後,你可以指定雜湊表的名稱,後跟@
字元以將所有引數傳送到指令碼。
$params = @{
Param1 = 'value'
Param2 = 'valuenext'
Param3 = 'somevalue'
Param4 = 'somevalue'
Param5 = 'somevalue'
Param6 = 'somevalue'
Param7 = 'somevalue'
DisplayParam2 = $true
}
PS> ./test.ps1 @params
PowerShell 引數屬性
引數特性允許你以多種方式更改引數功能。你可以使用正規表示式來擬合正規表示式,強制使用給定引數,並驗證提供給引數的值。
強制引數
在 PowerShell 中,我們可以根據自己的意願要求在函式中執行一個或多個屬性。因此,我們可以在 Parameter()
構造中使用 mandatory
屬性。
param(
[Parameter(Mandatory)]
[string]$Param1,
[Parameter()]
[string]$Param2,
[Parameter()]
[switch]$DisplayParam2
)
Write-Host "Param1 value is $Param1"
if ($DisplayParam2.IsPresent) {
Write-Host "Param2 value is $Param2"
}
輸出:
引數驗證
最後,仔細檢查提供給引數的值是否正確。它非常適合將某人賦予引數唯一值的可能性降至最低。因此,我們可以使用 ‘ValidateSet()’ 指定我們想要的輸入,如下所示。
param(
[Parameter(Mandatory)]
[ValidateSet('x', 'y')]
[string]$Param1,
[Parameter()]
[string]$Param2,
[Parameter()]
[switch]$DisplayParam2
)
Write-Host "Param1 value is $Param1"
if ($DisplayParam2.IsPresent) {
Write-Host "Param2 value is $Param2"
}
如果我們將 x 和 y 以外的值賦予 param1,則會彈出錯誤。
具有命名引數語法的高階函式
將 Cmdletbinding 屬性新增到函式時,會將其變為高階函式。構造高階函式時使用其他常用引數。語法如下。
function testfunction
{
[CmdletBinding (DefaultParameterSetName='Param1')]
Param
(
[Parameter(Mandatory=$true, Position=0, ParameterSetName='Param1')]
[string] Param1,
[Parameter(Mandatory=$true, Position=0, ParameterSetName='Param2')]
[string] Param2,
)
}
Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.