代码之家  ›  专栏  ›  技术社区  ›  mazzy

cmdlet和函数有什么区别?

  •  5
  • mazzy  · 技术社区  · 7 年前

    a中有两个元素 module manifest

    cmdlet和函数有什么区别?

    2 回复  |  直到 7 年前
        1
  •  10
  •   Bruce Payette    7 年前

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

        2
  •  11
  •   mklement0    6 年前

    补充 Bruce Payette's helpful answer :

    在PowerShell中并非所有函数都是平等创建的:

    • 一个 advanced function 是用PowerShell写的吗 cmdlet (如前所述 从.NET语言);修饰函数的 param(...) [CmdletBinding()] attribute 或者至少装饰一个 parameter with a [Parameter()] attribute 谢谢, Ansgar Wiechers 是什么让它 一个;因此,它支持 标准行为 :

      • common parameters 例如 -Verbose ,和 -OutVariable 如果相应地实现了该函数,则 -WhatIf -Confirm .
      • 参数未绑定到显式声明的参数会导致调用时出错。
      • 通常,但不一定,高级函数通过 process { ... } ValueFromPipeline 和/或 ValueFromPipelineByPropertyName .

      • 不幸的是,甚至 :

    • simple function 相比之下:

      • 适用于脚本和模块内部 功能
      • 需要较少的“仪式”(没有参数属性的简单语法,单个脚本块体)
      • $Input 甚至通过 进程{。。。}
      • 也运行在 子范围 看得见的 修改 它们(通常应该避免)需要调用 Set-Variable 具有 -Scope 1
      • 注意,还有一个专门的,但很少使用的 变体 为管道处理优化的简单函数,定义为 Filter 关键字。它的主体为每个管道输入对象隐式调用,反映在自动变量中 $_ .

    将函数作为模块的一部分导出 -最好通过其模块清单( *.psd1 执行 功能是 先进的 是的,是的 先进的 功能 .

    推荐文章