【发布时间】:2019-01-25 10:34:31
【问题描述】:
module manifest 中有两个元素:cmdlet 和函数。
cmdlet 和函数有什么区别?
【问题讨论】:
标签: function powershell cmdlets
module manifest 中有两个元素:cmdlet 和函数。
cmdlet 和函数有什么区别?
【问题讨论】:
标签: function powershell cmdlets
补充Bruce Payette's helpful answer:
并非所有函数在 PowerShell 中都是一样的:
advanced function 是(二进制)cmdlet(如前所述,编译来自 .NET 语言);用[CmdletBinding()] attribute 装饰函数的param(...) 块或装饰至少一个parameter with a [Parameter()] attribute 谢谢,Ansgar Wiechers
是什么使它成为一个高级的;因此,它支持某些标准行为:
您将自动获得对common parameters 的支持,例如-Verbose 和-OutVariable,以及在选择加入的基础上对-WhatIf 和-Confirm 的支持。
无法绑定到显式声明的参数的参数会导致调用错误。
通常但不一定,高级函数通过process { ... } 脚本块、通过ValueFromPipeline 和/或ValueFromPipelineByPropertyName 修饰的参数绑定参数支持一对一的管道输入处理。
不幸的是,即使是高级函数和 cmdlet 也不是完全平等的:
高级函数在子变量范围内运行,这与 cmdlet 不同。
$PSCmdlet.SessionState.PSVariable 对象,如this answer 所示。高级功能apply culture-invariant parameter conversions, unlike cmdlets。
高级函数,在 Windows PowerShell 中,handle ValueFromRemainingArguments differently than cmdlets。
相比之下,simple function:
$Input 甚至通过 process { ... } 块来处理管道输入。Set-Variable 和 -Scope 1。Filter 关键字定义。它的主体为每个管道输入对象隐式调用,反映在自动变量 $_ 中。虽然将函数导出为模块的一部分 - 最好通过其模块清单 (*.psd1) - 并没有强制函数是高级 em> 个,只导出高级函数是好习惯。
【讨论】:
SupportsShouldProcess=$true and SupportsShouldProcess=$false的名称有什么不同
SupportsShouldProcess 的函数获得了对-WhatIf 和-Confirm 通用参数的支持。
$PSCmdlet.SessionState.PSVariable。
cmdlet 是用 C# 或其他 .NET 语言编写的 .NET 类,包含在 .dll 中(即二进制模块中)。函数在 PowerShell 中的脚本、脚本模块或命令行中直接指定。模块清单可能包括脚本和二进制模块,因此清单需要能够导出 cmdlet 和函数。甚至可以从单个清单中导出具有相同名称的 cmdlet 和函数,但通常不建议这样做。
【讨论】: