Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我需要使用';参数setName';使用PowerShell开关?_Powershell - Fatal编程技术网

为什么我需要使用';参数setName';使用PowerShell开关?

为什么我需要使用';参数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

我的问题是关于参数字段'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
我明白了

而称之为

.\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)使用逗号。这个开关对我来说似乎是个完美的选择。你能扩展你的推理吗?如果它没有实际的区别,那么我会留下来,因为它消除了代码中关于默认值可能是什么的任何歧义。