我正在编写一个更新 *.CSV 文件的函数,该文件将由将更新 DNS 区域的 puppet 脚本拾取。因为我不想破坏真正的.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)
用来处理开关的各种功能。当我做 aGet-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>更新-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
如果调用函数的代码不提供任何参数,有没有人建议我如何让我的函数采用开关默认值?