2012-06-13 3 views

ответ

1

System.Management.Automation.RuntimeDefinedParameter имеет свойство «Value», так что я предполагаю, что я хотел бы использовать его, чтобы установить значение по умолчанию. Это похоже на работу (когда я отлаживаю скрипт, я вижу это значение по умолчанию с помощью $ PSCmdlet.GetDynamicParameters()), но мне не удавалось получить доступ к нему в реальной функции (это выполнение «умерло» в вызове $ pscmdlet.GetDynamicParameters()) ,

В любом случае: когда я указал значение, моя функция показывала связанное значение, а не значение по умолчанию.

Не уверен, что это помогает, и TBH Я почти не вижу случая использования для значения по умолчанию, когда параметр является динамическим. Хотелось бы узнать, зачем вам это нужно. :)

+0

мне нужно по умолчанию значение, чтобы параметр требуется. Подобно 'function f ($ p = @ (throw« p требуется »)) {}' – Jack128

+0

Не было бы «обязательным» лучшим выбором, чем ...? – BartekB

+0

Нет. Обязательное диалоговое окно показа (или приглашение командной строки), но мой скрипт должен работать без человеческих поступков. – Jack128

0

Это не совсем то, что вам нужно, но, по крайней мере, хорошее решение (требуется PowerShell 3.0):

Вы можете установить значения по умолчанию для всех параметров всех функций с помощью $PSDefaultParameterValues. См. https://technet.microsoft.com/en-us/library/hh847819.aspx или используйте справку PowerShell по телефону about_Parameters_Default_Values.

0

Как предложено Bartek, свойство Value может быть использован, как показано в коде ниже

DynamicParam { 
    [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
    $colorlist = [System.Enum]::GetNames([System.Drawing.KnownColor]) 

    $attributes = New-Object System.Management.Automation.ParameterAttribute 
    $attributes.ParameterSetName = "__AllParameterSets" 
    $attributes.Mandatory = $false 

    # Background color 
    $validationset = New-Object -Type System.Management.Automation.ValidateSetAttribute -ArgumentList $colorlist 
    $collection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] 
    $collection.Add($attributes) 
    $collection.Add($validationset) 
    $background = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Background", [String], $collection) 
    $background.Value = "Transparent" 

    $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary 
    $newparams.Add("Background", $background) 

return $newparams 
} 

Важный линии здесь составляет $ background.Value = «Прозрачный», где $ фон является RunTimeDefinedParameter.

Для тех, кто интересуется. Сначала я попытался использовать его как атрибут, но в параметрах ParameterAttributes нет .Value.

1

Пример Chrissy, вероятно, правильный способ сделать это, но мне не удалось получить значение по умолчанию. Параметр не существует в $ PSBoundParameters, когда указано значение по умолчанию.

«Обходной путь», который мы применяли, заключается в привязке $ PSBoundParameter ["Background"] к значению, которое мы хотим по умолчанию. $PSBoundParameters["Background"] = "Transparent"

Расширение примера Крисси:

DynamicParam { 
    [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
    $colorlist = [System.Enum]::GetNames([System.Drawing.KnownColor]) 

    $attributes = New-Object System.Management.Automation.ParameterAttribute 
    $attributes.ParameterSetName = "__AllParameterSets" 
    $attributes.Mandatory = $false 

    # Background color 
    $validationset = New-Object -Type System.Management.Automation.ValidateSetAttribute -ArgumentList $colorlist 
    $collection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] 
    $collection.Add($attributes) 
    $collection.Add($validationset) 
    $background = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Background", [String], $collection) 
    $PSBoundParameters["Background"] = "Transparent" 

    $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary 
    $newparams.Add("Background", $background) 

    return $newparams 
} 
+0

Это был единственный способ, которым я мог сам иметь динамический параметр со значением по умолчанию. Спасибо, Томас! –

Смежные вопросы