什么是[cmdletbinding()]以及它是如何工作的?

时间:2013-02-03 09:21:02

标签: powershell binding

根据get-help about_Functions_CmdletBindingAttribute

  

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

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

关于这种语法:

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

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

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

3 个答案:

答案 0 :(得分:12)

CmdletBinding,参数等是特殊的属性类,脚本编写者可以使用它们来定义PowerShell的行为,例如:使用Cmdlet功能使功能成为高级功能。

当您通过例如[CmdletBinding()]初始化该类的新实例。

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

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

有关属性类herehere

的更多信息

答案 1 :(得分:7)

一般来说,CmdletBinding是使用Advanced函数创建函数的原因。将它放在脚本的顶部会使脚本成为“高级”脚本。函数和脚本大致相同,其中脚本文件名等同于函数名,脚本内容等同于函数的scripblock部分。

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

答案 2 :(得分:2)

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

The PowerShell Language Specification B.2.4 部分的属性(简化)语法与C# Language Specification C.2.13 部分的语法进行比较:

  

B.2.4属性(PowerShell)

     

属性:
[ 属性名称 ( 属性参数 {{1} }

     

attribute-arguments:
attribute-argument
attribute-argument
) ] attribute-arguments

     

attribute-argument:
简单名称
, 表达

     
     

C.2.13属性(C#)

     

属性:
= attribute-name [ named-argument-list {{ 1}}

     

named-argument-list:
命名参数
命名参数列表
( 命名参数

     

命名参数:
标识符
) ] attribute-argument-expression



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

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