参数集 - 我如何使默认工作?
Parameter sets - how do I make the default work?
我正在编写一个更新 *.CSV 文件的函数,该文件将由将更新 DNS 区域的人偶脚本获取。因为我不想破坏 real .CSV 文件,所以我添加了一个虚拟文件。在开发此函数时,我有三个参数集:Reset
、Add
和 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
, $true
、true
或 Enter 键接受默认的 -Reset
参数总是抛出红色错误消息:
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
开关默认值吗?
虽然我通常会鼓励 [Switch]
参数在定义参数集时是强制性的,但在您的情况下,您不能那样做,正如 PetSerAl 所说,您必须将其设为可选。
原因归结为 Mandatory
的实际含义。这不仅仅意味着它必须有一个值,还意味着参数必须是 bound ,由调用者提供。这与为强制参数提供默认值不起作用的原因相同。
我正在编写一个更新 *.CSV 文件的函数,该文件将由将更新 DNS 区域的人偶脚本获取。因为我不想破坏 real .CSV 文件,所以我添加了一个虚拟文件。在开发此函数时,我有三个参数集:Reset
、Add
和 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
, $true
、true
或 Enter 键接受默认的 -Reset
参数总是抛出红色错误消息:
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
开关默认值吗?
虽然我通常会鼓励 [Switch]
参数在定义参数集时是强制性的,但在您的情况下,您不能那样做,正如 PetSerAl 所说,您必须将其设为可选。
原因归结为 Mandatory
的实际含义。这不仅仅意味着它必须有一个值,还意味着参数必须是 bound ,由调用者提供。这与为强制参数提供默认值不起作用的原因相同。