我的问题是关于参数字段'parametersetname',并且需要包含它神秘。
我有一个名为test.ps1的PowerShell(v3)脚本:
param([parameter(parametersetname="anything")][switch]$foo=$false)
$foo.IsPresent
如果我在PowerShell IDE cmd行中运行它,如下所示:
.\test.ps1
我得到了
> False
用
调用它.\test.ps1 -foo
我得到了
> True
两者都很好。 然而,我花了一些时间(年龄)才意识到,为了切换到工作,我必须添加这个描述符“parametersetname”。
因为如果我重复我的测试,但省略“parametersetname”,如下所示:
param([parameter][switch]$foo=$false)
$foo.IsPresent
当我运行时:
.\test.ps1
我收到错误:
无法对参数'foo'进行参数转换。无法将“System.Management.Automation.SwitchParameter”类型的“False”值转换为类型 “System.Management.Automation.ParameterAttribute”。
用
调用它.\test.ps1 -foo
我得到了
缺少参数'foo'的参数。指定“System.Management.Automation.ParameterAttribute”类型的参数,然后重试。
有谁知道为什么?
'parametersetname'有什么魔力?
答案 0 :(得分:5)
您不需要使用参数名称,但您需要在参数后使用括号。
如果省略括号,似乎powershell将其作为参数的类型信息读取并尝试将参数转换为该类型,而不是将其视为参数属性。
param([Parameter()][switch]$foo=$false)
按原样运作
param([switch]$foo=$false)