为什么我需要在PowerShell开关中使用'parametersetname'?

时间:2016-02-08 14:22:22

标签: powershell

我的问题是关于参数字段'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'有什么魔力?

1 个答案:

答案 0 :(得分:5)

您不需要使用参数名称,但您需要在参数后使用括号。

如果省略括号,似乎powershell将其作为参数的类型信息读取并尝试将参数转换为该类型,而不是将其视为参数属性。

param([Parameter()][switch]$foo=$false)

按原样运作

param([switch]$foo=$false)