参数集-如何使默认设置起作用?

丹尼尔

我正在编写一个更新* .CSV文件的功能,该文件将由将更新DNS区域的木偶脚本拾取。由于我不想破坏真实的.CSV文件,因此添加了一个虚拟文件。当我开发这个功能,我有三个参数集:ResetAdd,和Remove这些参数将分别用当前的规范.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$truetrue,或Enter键接受这似乎是默认-Reset参数总是引发红色错误消息:

PS> Update-DNS_Dev 
cmdlet命令管道位置1上的Update-DNS_Dev
提供以下参数的值:(
键入!?以获取帮助。)
重置:

Update-DNS_Dev:无法处理参数“重置”上的参数转换。
无法将值“ System.String”转换为类型“ System.Management.Automation.SwitchParameter 
”。布尔参数仅接受布尔值和数字,
例如$ True,$ False,1或0。
在第1行:char:1 
+ Update-DNS_Dev 
+ ~~~~~~~~~~~~~ 
    + + CategoryInfo: InvalidData:(:) [Update-DNS_Dev],ParameterBindingArgumentTransformationException 
    + FullyQualifiedErrorId:ParameterArgumentTransformationError,Update-DNS_Dev

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

英国主义者

虽然我通常会鼓励[Switch]在定义参数集时将参数设为强制性参数,但在您的情况下,您不能那样做,正如PetSerAl所说,您必须将其设置为可选参数。

原因归结为Mandatory实际含义。这不仅意味着它必须具有值,还意味着参数必须按调用者提供的那样进行绑定这是为什么给默认值给强制性参数不起作用的相同原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章