参数集 - 如何使默认工作?

时间:2016-08-29 20:43:40

标签: function powershell parameter-sets

我正在编写一个更新* .CSV文件的函数,该文件将由更新DNS区域的木偶脚本提取。由于我不想破坏真正的 .CSV文件,我添加了一个虚拟文件。在我开发此功能时,我有三个参数集:ResetAddRemove。这些参数将使用当前规范.CSV文件覆盖我的虚拟文件,分别添加记录和删除记​​录。主脚本永远不会调用该函数,其中两个或所有三个交换机都处于活动状态。

以下是我编写脚本参数块的方法:

function Update-DNS_Dev
{
    [CmdletBinding(defaultparametersetname='Reset')]
    [OutputType([int])]
    Param
    (
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0,
                   ParameterSetName='Reset')]
        [switch]$Reset,

        [Parameter(Mandatory=$true,
            ValueFromPipelineByPropertyName=$true,
            Position=0,
            ParameterSetName='Remove')]
        [switch]$Remove,

        [Parameter(Mandatory=$true,
            ValueFromPipelineByPropertyName=$true,
            Position=0,
            ParameterSetName='Add')]
        [switch]$Add,

        # Name of a Dummy file
        [Parameter(ValueFromPipelineByPropertyName=$true,
                   Position=1)]
        [string]$DummyFile = "{0}\dPvmnames.csv" -f $DNSScratchpad,

        [Parameter(ValueFromPipelineByPropertyName=$true,
                    ParameterSetName='Remove')]
        [Parameter(ValueFromPipelineByPropertyName=$true,
                    ParameterSetName='Add')]
        [string]$servername,

        [Parameter(ValueFromPipelineByPropertyName=$true,
                    ParameterSetName='Add')]
        [Parameter(ValueFromPipelineByPropertyName=$true,
                    ParameterSetName='Remove')]
        [string]$domain,

        [Parameter(ValueFromPipelineByPropertyName=$true,
                    ParameterSetName='Add')]
        [string]$details,

        [Parameter(ValueFromPipelineByPropertyName=$true,
                    ParameterSetName='Add')]
        [string]$type
    )
}

在脚本中,我使用switch ($psCmdlet.ParameterSetName)来处理交换机的各种功能。当我做Get-Help Update-DNS时,我看到预期的输出:

PS> get-help Update-DNS_Dev

NAME
    Update-DNS_Dev

SYNTAX
    Update-DNS_Dev [-Reset] [[-DummyFile] <string>]  [<CommonParameters>]

    Update-DNS_Dev [-Remove] [[-DummyFile] <string>] [-servername <string>] [-domain <string>]  [<CommonParameters>]

    Update-DNS_Dev [-Add] [[-DummyFile] <string>] [-servername <string>] [-domain <string>] [-details <string>] [-type <string>]  [<CommonParameters>]

当我调用该函数并提供-Reset参数时,我的脚本按预期执行,但如果我在没有任何参数的情况下调用它,我的默认值不会生效,并且点击1,{{ 1}},$true Enter 键接受看似默认的true参数,始终会抛出红色错误消息:

PS> Update-DNS_Dev 
cmdlet Update-DNS_Dev at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
Reset: 

Update-DNS_Dev : Cannot process argument transformation on parameter 'Reset'.
Cannot convert value "System.String" to type "System.Management.Automation.
SwitchParameter". Boolean parameters accept only Boolean values and numbers,
such as $True, $False, 1 or 0.
At line:1 char:1
+ Update-DNS_Dev
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Update-DNS_Dev], ParameterBindingArgumentTransformationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,Update-DNS_Dev

如果调用该函数的代码不提供任何参数,是否有人建议如何使我的函数取-Reset开关默认值?

1 个答案:

答案 0 :(得分:1)

虽然我通常会鼓励sudo参数在定义参数集时是必需的,但在你的情况下你不能这样做,而且PetSerAl说你必须使它成为可选项。

原因归结为[Switch]实际意味着什么。它并不仅仅意味着它必须具有值,这意味着参数必须绑定,如调用者提供的那样。这与为必需参数提供默认值不起作用的原因相同。