cmdlet和函数有什么区别?

时间:2018-08-18 18:10:50

标签: function powershell cmdlets

module manifest中有两个元素:cmdlet和函数。

cmdlet和函数有什么区别?

2 个答案:

答案 0 :(得分:9)

cmdlet是用C#或其他.NET语言编写的.NET类,包含在.dll中(即,在二进制模块中)。直接在PowerShell中的脚本,脚本模块或命令行中指定功能。模块清单可能同时包含脚本和二进制模块,因此清单需要能够导出cmdlet和函数。尽管通常不建议从单个清单中导出同一个cmdlet和具有相同名称的函数,甚至是可能的。

答案 1 :(得分:7)

补充Bruce Payette's helpful answer

并非在PowerShell中创建的所有功能都相同:

  • advanced function cmdlet (如所述,已编译(来自.NET语言);用[CmdletBinding()] attribute装饰一个函数的param(...)块或装饰至少一个parameter with a [Parameter()] attribute 感谢Ansgar Wiechers 是什么使它成为高级之一;因此,它支持某些标准行为

    • 您将自动支持common parameters,例如-Verbose-OutVariable,并且,如果相应地实现了该功能,则会自动支持-WhatIf-Confirm。 / li>
    • 未绑定到显式声明的参数的参数会导致调用错误。
    • 通常(但不一定),高级功能通过process { ... }脚本块,通过用ValueFromPipeline和/或{装饰的参数绑定参数来支持一对一的管道输入处理。 {1}}。

    • 不幸的是,即使高级功能和cmdlet的创建也不完全相同

  • 相比之下,
  • A simple function

    • 适用于脚本和模块内部的 helper 功能
    • 需要较少的“仪式”(语法简单,不带参数属性,单个脚本块主体)
    • 但是,如果需要,
    • 仍然可以通过自动变量ValueFromPipelineByPropertyName或什至通过$Input块来处理管道输入。
    • 请注意,还有一个专门的但很少使用的变体,它是使用process { ... }关键字定义的,针对管道处理进行了优化的简单函数。对于每个管道输入对象,都会隐式调用其主体,反映在自动变量Filter中。

将功能导出为模块的一部分时-最好通过其模块清单($_)-不会强制将功能设为

,这是好的做法,只导出高级功能

相关问题