55

根据get-help about_Functions_CmdletBindingAttribute

CmdletBinding 属性是使它们像编译的 cmdlet 一样运行的函数的属性

我们可以在脚本的顶部使用它。这种情况下的功能是什么?PowerShell引擎为其所有输入调用的内部隐式“main”函数?

关于这个语法:

[CmdletBinding(ConfirmImpact=<String>,
                     DefaultParameterSetName=<String>,
                     HelpURI=<URI>,
                     SupportsPaging=<Boolean>,
                     SupportsShouldProcess=<Boolean>,
                     PositionalBinding=<Boolean>)]

我们在做什么?实例化一个cmdlbinding对象并将参数列表传递给它的构造函数?此语法可以在param()- 例如:[Parameter(ValueFromPipeline=$true)]. 此语法是否具有特定名称,是否可以在其他地方找到?

最后,作为简单的 PowerShellers,我们是否能够模仿此功能并通过设置属性来修改脚本的行为?

4

3 回答 3

16

一般来说,CmdletBinding 是将函数变成高级函数的原因。将它放在脚本的顶部会使脚本成为“高级”脚本。函数和脚本大体相同,脚本文件名相当于函数名,脚本内容相当于函数的脚本块部分。

CmdletBinding 属性使您可以控制函数功能,例如添加 Confirm 和 WhatIf 支持(通过 SupportsShouldProcess)、禁用参数位置绑定等。

于 2013-02-03T09:51:11.833 回答
16

CmdletBinding、Parameter 等是脚本编写者可以用来定义 PowerShell 行为的特殊属性类,例如,使函数成为具有 Cmdlet 功能的高级函数。

当您通过例如调用它们时,[CmdletBinding()]您会初始化该类的新实例。

在以下位置阅读有关 CmdletBindingAttribute 类的更多信息:MSDN

在以下位置阅读有关 ParameterAttribute 类的更多信息:MSDN

更多关于属性类herehere

于 2013-02-03T12:19:46.873 回答
3

关于语法问题,格式与使用 C# 中的命名参数将 .NET 属性类应用于成员的方式非常匹配。

将 PowerShell 语言规范的B.2.4节中的属性(简化)语法与C# 语言规范的C.2.13节中的属性进行比较:

B.2.4 属性   (PowerShell)

属性:
  [ 属性名称 ( 属性参数 ) ]

属性参数:
  属性参数
  属性参数
, 属性参数

属性参数:
  简单名称
= 表达式


C.2.13 属性   (C#)

属性:
  [ 属性名称 ( 命名参数列表 ) ]

命名参数列表:
  命名参数
  命名参数列表
, 命名参数

命名参数:
  标识符
= 属性参数表达式



我同意从概念上的简洁性来看,例如重用哈希表初始化语法进行属性初始化可能会很好。但是,我可以想象支持哈希表中的所有选项(如[A(P=v)][A('P'=v)]$n = 'P'; [A($n=v)]等,或它们的某些特定子集)只是;用作分隔符会比它的价值更麻烦。

另一方面,如果您想使用高级功能,那么学习高级语法可能是有意义的:)

于 2013-03-31T23:46:11.013 回答