为啥脚本化的 cmdlet 被列为函数?

Posted

技术标签:

【中文标题】为啥脚本化的 cmdlet 被列为函数?【英文标题】:Why are scripted cmdlets listed as functions?为什么脚本化的 cmdlet 被列为函数? 【发布时间】:2013-08-30 09:52:49 【问题描述】:

如果我创建一个简单的 Powershell 函数,例如

Function Hello 
    [CmdletBinding( )]
    Param (
        [parameter()]
        $Name
    )
    Begin
    Process
        Write-Output "Hello $Name"
    
    End
    

然后使用 Get-Command 将其与Get-Command Hello 一起列出,该 cmdlet 被列为“CommandType”函数。为什么它没有列为“CommandType”cmdlet?

从模块导出时,我还发现我必须使用 FunctionsToExport 而不是 CmdletsToExport。

好像不影响函数的使用,只是好奇为什么会这样列出来。

【问题讨论】:

【参考方案1】:

函数和 cmdlet 之间可能没有太大区别,但这取决于您愿意投入多少工作来编写函数。 Don Jones wrote an article on TechNet 在这些第一次出现时强调其中的一些差异。

这些完全用脚本编写的函数与用 C# 或 Visual Basic 编写并在 Visual Studio 中编译的“真实”cmdlet 具有相同的功能。这些高级功能(它们最初在 v2 开发周期的早期被称为“脚本 cmdlet”)可帮助您编写更灵活的功能,然后可以与常规 cmdlet 一起无缝使用。

...

纯函数和完整 cmdlet 之间的真正区别在于 cmdlet 支持强大的参数绑定。您可以使用位置参数、命名参数、强制参数,甚至进行基本的参数验证检查——只需向 shell 描述参数即可。

您提供的代码示例已经开始模糊两者之间的界限,它允许通过[CmdletBinding()] 添加大量参数,并开始描述一个名为$Name 的全新参数。例如,您现在可以在该函数中的任何位置使用Write-Verbose,并调用-Verbose 标志来查看这些语句,而无需执行任何额外的工作。

从功能上讲,编译后的 cmdlet 或用 powershell 编写的函数的最终结果不必有太大的不同 - 似乎更多的是区分编译后的 cmdlet 和脚本函数的问题。

【讨论】:

按照您的回答,脚本化的 Cmdlet 和编译的 Cmdlet 之间应该没有任何区别。但是,在 PowerShell v4 中,我无法使用脚本化的 Cmdlet(function) 使 PipelineVariable 正常工作。代码或我对脚本化 Cmdlet 和编译 Cmdlet 的理解是否有问题。我的问题源于这个 SO question - ***.com/questions/50533763/…

以上是关于为啥脚本化的 cmdlet 被列为函数?的主要内容,如果未能解决你的问题,请参考以下文章

术语“go”不被识别为cmdlet,函数,脚本文件或可操作程序的名称

PowerShell 该术语未被识别为 cmdlet 函数脚本文件或可运行程序

无法将“vue”项识别为 cmdlet函数脚本文件或可运行程序的名称

ssh:术语“ssh”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称

eb :术语“eb”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称

cl:术语“cl”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称