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

17
如果我创建一个简单的PowerShell函数,例如:
Function Hello {
    [CmdletBinding( )]
    Param (
        [parameter()]
        $Name
    )
    Begin{}
    Process{
        Write-Output "Hello $Name"
    }
    End{}
    }

然后使用Get-Command Hello命令来列出它,该cmdlet被列为“CommandType”函数而不是“CommandType” cmdlet。为什么会这样?

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

它似乎并不影响函数的使用,我只是好奇为什么它们被列成这样。

1个回答

18

函数和命令都可以实现相同的功能,但取决于您编写函数时愿意付出多少努力。当初PowerShell推出这两者之间的区别不是很大,Don Jones曾在TechNet上撰写文章以凸显其中一些区别。

这些纯脚本编写的函数具有与C#或Visual Basic编译并在Visual Studio中编写的“真正”的命令相同的功能。这些高级函数(在v2开发周期早期称为“脚本命令”)可帮您编写更灵活的函数,然后可以轻松地与常规命令集一起使用。

...

真正的命令与普通函数的主要区别在于,命令支持强大的参数绑定。 您可以使用位置参数、命名参数、强制参数,甚至可以通过简单地描述shell来进行基本的参数验证检查。

您提供的代码示例已经开始模糊了两者之间的差异,因为它可以通过使用 [CmdletBinding()] 来添加许多附加参数,并开始描述一个全新的参数叫做$Name。例如,现在您可以在该函数的任何位置使用Write-Verbose命令,并调用-Verbose标志来查看这些语句,而无需做任何其他工作。

从功能上讲,编译的命令和用PowerShell编写的函数的最终结果可能并没有太大的区别-似乎更多是区分编译的命令和脚本函数的问题。


1
根据您的回答,脚本化Cmdlet和编译Cmdlet之间不应该有任何区别。然而,在PowerShell v4中,我无法让PipelineVariable与脚本化Cmdlet(函数)正常工作。是代码有问题还是我对脚本化Cmdlet和编译Cmdlet的理解有误?我的问题源自这个SO问题 - https://stackoverflow.com/questions/50533763/powershell-pipelinevariable-parameter-contains-only-first-value-in-a-collection - Siva Senthil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接