如果我创建一个简单的Powershell函数,例如
Function Hello {
[CmdletBinding( )]
Param (
[parameter()]
$Name
)
Begin{}
Process{
Write-Output "Hello $Name"
}
End{}
}
然后使用Get-Command将其列为Get-Command Hello
,cmdlet列为' CommandType'功能。为什么它没有被列为' CommandType'小命令?
从模块导出时,我发现我必须使用FunctionsToExport而不是CmdletsToExport。
它似乎不会影响功能的使用,我只是好奇他们为什么会这样列出。
答案 0 :(得分:18)
函数和cmdlet之间可能没有太大区别,但这取决于您愿意为编写函数做多少工作。唐·琼斯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与脚本函数区分开来。