为什么脚本化cmdlet列为函数?

时间:2013-08-27 14:59:34

标签: function powershell cmdlets

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

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

然后使用Get-Command将其列为Get-Command Hello,cmdlet列为' CommandType'功能。为什么它没有被列为' CommandType'小命令?

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

它似乎不会影响功能的使用,我只是好奇他们为什么会这样列出。

1 个答案:

答案 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与脚本函数区分开来。