Давайте поговорим о том, почему это не работает
function Test()
param(
[Parameter(Mandatory=$false, Position=0)]
[ValidateSet('Controllers','test2','test3')]
[String]$options
)
}
Параметры - это переменные, которые создаются и заполняются в начале скрипта
ValidateSet
разрешит выполнение сценария, только если $Options
равен одному из трех вариантов 'Controllers','test2','test3'
Давайте поговорим о том, что именно все []
делают
Mandatory=$false
означает, что $options
не обязательно должен быть чем-то, что нужно для запуска скрипта.
Position=0
означает, что если вы ввели скрипт без использования -options
, то первое, что вы добавите, все равно будут опции
Пример
#If Position=0 then this would work
Test "Controllers"
#Also this would work
Test -options Controllers
[ValidateSet('Controllers','test2','test3')]
означает, что если используется Option или Mandatory
, то оно должно равняться 'Controllers','test2','test3'
Звучит так, как будто вы пытаетесь создать параметры во время выполнения. Ну, это возможно, используя DynamicParam
.
function Test{
[CmdletBinding()]
param()
DynamicParam {
$Parameters = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
'Controllers','test2','test3' | Foreach-object{
$Param = New-Object System.Management.Automation.ParameterAttribute
$Param.Mandatory = $false
$AttribColl = New-Object System.Collections.ObjectModel.Collection[System.Attribute]
$AttribColl.Add($Param)
$RuntimeParam = New-Object System.Management.Automation.RuntimeDefinedParameter("$_", [string], $AttribColl)
$Parameters.Add("$_", $RuntimeParam)
}
return $Parameters
}
begin{
$PSBoundParameters.GetEnumerator() | ForEach-Object{
Set-Variable $_.Key -Value $_.Value
}
}
process {
"$Controllers $Test2 $Test3"
}
}
DynamicParam позволяет создавать параметры в коде. Приведенный выше пример превращает массив 'Controllers','test2','test3'
в 3 отдельных параметра.
Test -Controllers "Hello" -test2 "Hey" -test3 "Awesome"
возвращает
Hello Hey Awesome
Но вы сказали, что хотите сохранить hypen и параметр
Таким образом, строка
$PSBoundParameters.GetEnumerator() | ForEach-Object{
Set-Variable $_.Key -Value $_.Value
}
позволяет определить значение каждого параметра. небольшое изменение как:
$PSBoundParameters.GetEnumerator() | ForEach-Object{
Set-Variable $_.Key -Value "-$($_.Key) $($_.Value)"
}
Вернется
-Controllers Hello -test2 Hey -test3 Awesome