为什么我需要使用';参数setName';使用PowerShell开关?
我的问题是关于参数字段'parametersetname',需要包含它 我有一个名为test.ps1的PowerShell(v3)脚本:为什么我需要使用';参数setName';使用PowerShell开关?,powershell,Powershell,我的问题是关于参数字段'parametersetname',需要包含它 我有一个名为test.ps1的PowerShell(v3)脚本: param([parameter(parametersetname="anything")][switch]$foo=$false) $foo.IsPresent 如果我在PowerShell IDE命令行中运行它,如下所示: .\test.ps1 param([parameter][switch]$foo=$false) $foo.IsPresent
param([parameter(parametersetname="anything")][switch]$foo=$false)
$foo.IsPresent
如果我在PowerShell IDE命令行中运行它,如下所示:
.\test.ps1
param([parameter][switch]$foo=$false)
$foo.IsPresent
我明白了
而称之为
.\test.ps1 -foo
.\test.ps1 -foo
我明白了
> True
都很好。
然而,我花了一段时间(很久)才意识到,要让交换机工作,我必须添加这个描述符“parametersetname”
因为如果我重复我的测试,但像这样省略“parametersetname”:
.\test.ps1
param([parameter][switch]$foo=$false)
$foo.IsPresent
当我运行此命令时:
.\test.ps1
我得到一个错误:
无法处理参数“foo”上的参数转换。无法将“System.Management.Automation.SwitchParameter”类型的“False”值转换为类型
“系统、管理、自动化、参数属性”
而称之为
.\test.ps1 -foo
.\test.ps1 -foo
我明白了
> True
缺少参数“foo”的参数。请指定“System.Management.Automation.ParameterAttribute”类型的参数,然后重试
有人知道为什么吗
“parametersetname”有什么神奇之处?您不需要使用parametersetname,但需要在参数后面加上括号 如果省略括号,则powershell似乎正在将其作为参数的类型信息读取,并尝试将参数强制转换为该类型,而不是将其视为参数属性
param([Parameter()][switch]$foo=$false)
工作如常
param([switch]$foo=$false)
括号中的魔力:
[parameter()]
。您不需要将默认值设置为false,布尔值当然会默认为false,而无需赋值。虽然没有实际意义,但为什么?我想要默认行为,可以关闭。我的具体例子是,我想用点替换通常格式化的版本字符串(在我的资料中)。但我有一些旧东西(MFC)使用逗号。这个开关对我来说似乎是个完美的选择。你能扩展你的推理吗?如果它没有实际的区别,那么我会留下来,因为它消除了代码中关于默认值可能是什么的任何歧义。