为啥脚本化的 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、函数、脚本文件或可运行程序的名称