【问题标题】:What is the difference between a cmdlet and a function?cmdlet 和函数有什么区别?
【发布时间】:2019-01-25 10:34:31
【问题描述】:

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

cmdlet 和函数有什么区别?

【问题讨论】:

    标签: function powershell cmdlets


    【解决方案1】:

    补充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 的支持。

      • 无法绑定到显式声明的参数的参数会导致调用错误。

      • 通常但不一定,高级函数通过process { ... } 脚本块、通过ValueFromPipeline 和/或ValueFromPipelineByPropertyName 修饰的参数绑定参数支持一对一的管道输入处理。

      • 不幸的是,即使是高级函数和 cmdlet 也不是完全平等的

    • 相比之下,simple function

      • 适用于脚本和模块内部的helper函数
      • 需要更少的“仪式”(没有参数属性的更简单的语法,单脚本块体)
      • 但是,如果需要,仍然可以通过自动变量 $Input 甚至通过 process { ... } 块来处理管道输入。
      • 默认情况下也在子范围中运行;在模块之外(无论如何都不应该从中导出简单函数),由于 PowerShell 的动态作用域,调用者的变量是 可见 的; 修改它们(通常应该避免)需要调用 Set-Variable-Scope 1
      • 请注意,还有一个专门的但很少使用的变体,它是一个针对管道处理优化的简单函数,使用Filter 关键字定义。它的主体为每个管道输入对象隐式调用,反映在自动变量 $_ 中。

    虽然将函数导出为模块的一部分 - 最好通过其模块清单 (*.psd1) - 并没有强制函数是高级 em> 个,只导出高级函数是好习惯

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 知道了。非常感谢。
    • 值得强调的是,许多社区模块提供的 cmdlet 被编写为函数,但其​​行为(从用户角度)与上述实际 cmdlet 完全相同。
    • 请注意,PowerShell 团队已正式更改 cmdlet 一词的定义,以包括“高级功能”等。见github.com/MicrosoftDocs/PowerShell-Docs/issues/6105
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2021-10-24
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 2016-07-06
    相关资源
    最近更新 更多