【问题标题】:Parameter sets - how do I make the default work?参数集 - 如何使默认值起作用?
【发布时间】:2016-08-29 20:43:40
【问题描述】:

我正在编写一个更新 *.CSV 文件的函数,该文件将由将更新 DNS 区域的 puppet 脚本拾取。由于我不想破坏 real .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$true、@987654331 @ 或 Enter 键来接受看似默认的 -Reset 参数总是会抛出红色错误消息:

PS> 更新-DNS_Dev
命令管道位置 1 处的 cmdlet Update-DNS_Dev
为以下参数提供值:
(输入 !? 寻求帮助。)
重置:

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

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

【问题讨论】:

  • 不要强制-Reset

标签: function powershell parameter-sets


【解决方案1】:

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

原因归结为Mandatory 的实际含义。这不仅意味着它必须有一个值,还意味着参数必须是 bound ,由调用者提供。这与为强制参数赋予默认值不起作用的原因相同。

【讨论】:

  • 今天早上洗澡的时候我就想到了这件事。我一开始工作,我就测试了它....成功了!
猜你喜欢
  • 2012-08-01
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多