15

如果我创建一个简单的 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。

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

4

1 回答 1

18

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

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

...

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

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

从功能上讲,编译的 cmdlet 或用 powershell 编写的函数的最终结果根本不必有很大的不同——这似乎更像是将编译的 cmdlet 与脚本函数区分开来的问题。

于 2013-08-27T15:09:35.283 回答