[英]How to define further commonparameters for powershell functions defined within a bespoke module?
[英]Defining parameters common to all functions within a PowerShell module
我正在編寫一個 PowerShell 模塊,該模塊中的函數有一些參數將在所有函數中重復使用。 我不想在每次添加新函數時都復制粘貼函數定義,而是想像腳本變量一樣在頂部定義它們,然后將它們插入到每個函數中,以便在需要更改時給我一個更新位置.
查看動態參數的定義方式,似乎我應該能夠定義該類型的對象,然后在函數定義中引用它,但我無法在網上找到任何給我正確語法的信息。
使用 PowerShell 版本 7.2
$Script:ReUsedParameters = param(
[Parameter()]
[String]$Name,
[Parameter()]
[Int]$Id
)
Function New-Command {
Param ($ReUsedParameters)
Write-Output "Name: $Name, ID: $ID"
}
為了回答,您可以將運行時參數定義存儲在腳本塊中,然后在函數的dynamicparam
塊中調用它&
。
我認為這不是一個好主意,也不推薦使用它。 如果需要,所有函數都應該有自己的重復param
塊。
$reusedParameters = {
$paramDictionary = [System.Management.Automation.RuntimeDefinedParameterDictionary]::new()
# Since both parameters don't have any arguments (Mandatory, Position, ValueFromPipeline, etc..)
# you can use this one for both, otherwise, each dynamic parameter should have their own
# Parameter Declaration
[Parameter[]] $paramAttribute = [Parameter]::new()
$paramDictionary['Name'] = [System.Management.Automation.RuntimeDefinedParameter]::new('Name', [string], $paramAttribute)
$paramDictionary['Id'] = [System.Management.Automation.RuntimeDefinedParameter]::new('Id', [int], $paramAttribute)
return $paramDictionary
}
Function New-Command {
[CmdletBinding()] # `CmdletBinding` is Mandataroy here
param() # if the `param` block is empty
dynamicparam {
& $reusedParameters
}
end {
# Caveat: you can reference these parameters via $PSBoundParameters
# $Name and $Id are not part of the `param` block
# hence that wouldn't work here
"Name: {0}, ID: {1}" -f $PSBoundParameters['Name'], $PSBoundParameters['ID']
}
}
New-Command -Name asd -Id 123
作為一種聲明式方法,您可以將公共參數轉換為類屬性,並擁有一個類類型的函數參數。
class MyReUsedParameters {
[String] $Name
[Int] $Id = 23
}
Function New-Command {
Param (
[MyReUsedParameters] $ReUsedParameters,
$AnotherParam
)
Write-Output "Name: $($ReUsedParameters.Name), ID: $($ReUsedParameters.ID)"
}
New-Command -ReUsedParameters @{ Name = 'foo'; Id = 42 } -AnotherParam bar
傳遞具有匹配屬性的hashtable
或PSCustomObject
時,它將自動轉換為類類型。
您甚至可以驗證類似於常規參數的類屬性。 大多數參數驗證屬性也可以為類屬性指定。
class MyReUsedParameters {
[ValidateNotNullOrEmpty()] [String] $Name
[Int] $Id = 23
# Constructor - required to apply validation
MyReUsedParameters( [Hashtable] $ht ) {
$this.Name = $ht.Name
$this.Id = $ht.Id
}
}
Function New-Command {
Param (
[Parameter(Mandatory)]
[MyReUsedParameters] $ReUsedParameters
)
Write-Output "Name: $($ReUsedParameters.Name), ID: $($ReUsedParameters.ID)"
}
# Causes an error (as expected), because Name property is missing
New-Command -ReUsedParameters @{ Id = 42 }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.