PowerShell 函式引數

Migel Hewage Nimesha 2023年1月30日 2022年5月16日
  1. 定義 PowerShell 函式引數
  2. PowerShell 函式中的命名引數
  3. PowerShell 函式中的位置引數
  4. PowerShell 函式中的開關引數
  5. 在 PowerShell 函式引數中的 splatting
  6. PowerShell 引數屬性
  7. 具有命名引數語法的高階函式
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'

輸出:

影象-20211223173801745

執行此指令碼時,你會看到類似這樣的內容,其中每個引數變數都替換為執行時提供的值。

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 函式中切換引數

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

輸出:

powershell 函式中的強制引數

引數驗證

最後,仔細檢查提供給引數的值是否正確。它非常適合將某人賦予引數唯一值的可能性降至最低。因此,我們可以使用 ‘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,
    )
}
Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

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.