$dparamColl = @{
param1 = 'test';
param2 = 'abc';
param3 = 'xyz'
}
function function_name
{
param(
$param
)
dynamicParam {
$attributes = new-object System.Management.Automation.ParameterAttribute
$attributes.ParameterSetName = "__AllParameterSets"
$attributes.Mandatory = $true
$attributeCollection = new-object -Type System.Collections.ObjectModel.Collection[System.Attribute]
$attributeCollection.Add($attributes)
$_Values = $dparamColl.Keys
$ValidateSet = new-object System.Management.Automation.ValidateSetAttribute($_Values)
$attributeCollection.Add($ValidateSet)
$dynParam1 = new-object -Type System.Management.Automation.RuntimeDefinedParameter( "dparam", [string], $attributeCollection)
$paramDictionary = new-object -Type System.Management.Automation.RuntimeDefinedParameterDictionary
$paramDictionary.Add("dparam", $dynParam1)
return $paramDictionary
}
begin{}
process{
return $dparam
}
end{}
}
Można stworzyć osobną funkcję, która będzie zwracała RuntimeDefinedParameterDictionary z dynamicznymi parametrami:
function Get-DynamicParam
{
param(
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[array]$paramSet,
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$paramName)
$attributes = new-object System.Management.Automation.ParameterAttribute
$attributes.ParameterSetName = "__AllParameterSets"
$attributes.Mandatory = $true
$attributeCollection = new-object -Type System.Collections.ObjectModel.Collection[System.Attribute]
$attributeCollection.Add($attributes)
$_Values = $paramSet
$ValidateSet = new-object System.Management.Automation.ValidateSetAttribute($_Values)
$attributeCollection.Add($ValidateSet)
$dynParam1 = new-object -Type System.Management.Automation.RuntimeDefinedParameter( $paramName, [string], $attributeCollection)
$paramDictionary = new-object -Type System.Management.Automation.RuntimeDefinedParameterDictionary
$paramDictionary.Add($paramName, $dynParam1)
return $paramDictionary
}
Dynamiczny parametr pierwszy raz zastosowałem jak pisałem moduł do Oracla. W jednej zmiennej przetrzymuje zapytania sql, a funkcja z parametrem dynamicznym wywołuje to zapytanie sql:
$sqlHelpQueryCollection = @{
DatabaseName = @'
select ora_database_name from dual
'@;
Instance = @'
select * from v$instance
'@;
#and many more
}
function Invoke-OracleSqlHelpQuery
{
[CmdletBinding()]
param(
$conn
)
dynamicParam {
return Get-DynamicParam -paramSet $sqlHelpQueryCollection.Keys -paramName 'sqlHelpQuery'
}
begin{}
process{
$sql = $sqlHelpQueryCollection[$sqlHelpQuery]
return Get-OracleDataTable -conn $conn -sql $sql
}
end{}
}
Efekt dynamicznego parametru jest przedstawiony poniżej:Cały kod modułu jest na githubie.

Brak komentarzy:
Prześlij komentarz