Function cmdlet和函数之间有什么区别?

Function cmdlet和函数之间有什么区别?,function,powershell,cmdlets,Function,Powershell,Cmdlets,cmdlet和函数中有两个元素 cmdlet和函数之间有什么区别?cmdlet是用C#或其他.NET语言编写的.NET类,包含在.dll中(即二进制模块中)。函数直接在PowerShell中的脚本、脚本模块或命令行中指定。模块清单可能包括脚本和二进制模块,因此清单需要能够导出cmdlet和函数。甚至可以从单个清单中导出cmdlet和同名函数,但通常不建议这样做 补充: 并非所有函数在PowerShell中都是相同的: An是在PowerShell中编写的类似cmdlet(如上所述,它是从.NE

cmdlet和函数中有两个元素


cmdlet和函数之间有什么区别?

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

补充:

并非所有函数在PowerShell中都是相同的:

  • An是在PowerShell中编写的类似cmdlet(如上所述,它是从.NET语言编译而成);用或至少修饰一个函数的
    参数(…)
    块, 是什么使它成为一个先进的;因此,它支持某些标准行为:

    • 您可以获得自动支持,例如
      -Verbose
      -OutVariable
      ,如果相应地实现了该功能,还可以自动支持
      -WhatIf
      -Confirm
    • 未绑定到显式声明的参数的参数会导致调用时出错
    • 通常,但不一定,高级函数通过
      进程{…}
      脚本块,通过用
      valuefrompipline
      和/或
      valuefrompiplinebypropertyname
      修饰的参数绑定参数,支持逐个管道输入处理

    • 不幸的是,即使是高级函数和cmdlet也不是完全相同的:

      • 高级函数在子变量范围内运行,与cmdlet不同

        • 但是,通过
          $PSCmdlet.SessionState.PSVariable
          对象,即使在模块中放置的函数中也可以访问调用者的变量(对于模块之外的函数,由于PowerShell的动态作用域,调用者的变量在默认情况下是可见的),如中所示
      • 高级功能

      • Windows PowerShell中的高级功能。
        • 这种不一致性在PowerShell Core中得到了解决,但不幸的是,这种解决方式产生的问题比解决的问题多——请参阅GitHub问题和
  • A相比之下:

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

虽然将函数作为模块的一部分导出——最好是通过其模块清单(
*.psd1
)——并不强制要求函数是高级函数,但最好只导出高级函数

得到它。非常感谢。值得强调的是,许多社区模块提供的cmdlet都是以函数形式编写的,但其行为(从用户角度来看)与上述实际cmdlet完全相同。请注意,PowerShell团队已正式更改了cmdlet一词的定义,以包括“高级函数”等。看,我知道这是一个不同的问题,但我想在这里问它:@mazzy的名称是否有区别:不,这些高级函数的子类型没有特定的名称,但是那些实现
支持shouldprocess
的函数获得了对
-WhatIf
-Confirm
公共参数的支持。“高级函数在子变量作用域中运行,与cmdlet不同”-True,但确实存在。