Function cmdlet和函数之间有什么区别?
cmdlet和函数中有两个元素Function cmdlet和函数之间有什么区别?,function,powershell,cmdlets,Function,Powershell,Cmdlets,cmdlet和函数中有两个元素 cmdlet和函数之间有什么区别?cmdlet是用C#或其他.NET语言编写的.NET类,包含在.dll中(即二进制模块中)。函数直接在PowerShell中的脚本、脚本模块或命令行中指定。模块清单可能包括脚本和二进制模块,因此清单需要能够导出cmdlet和函数。甚至可以从单个清单中导出cmdlet和同名函数,但通常不建议这样做 补充: 并非所有函数在PowerShell中都是相同的: An是在PowerShell中编写的类似cmdlet(如上所述,它是从.NE
cmdlet和函数之间有什么区别?cmdlet是用C#或其他.NET语言编写的.NET类,包含在.dll中(即二进制模块中)。函数直接在PowerShell中的脚本、脚本模块或命令行中指定。模块清单可能包括脚本和二进制模块,因此清单需要能够导出cmdlet和函数。甚至可以从单个清单中导出cmdlet和同名函数,但通常不建议这样做 补充: 并非所有函数在PowerShell中都是相同的:
- An是在PowerShell中编写的类似cmdlet(如上所述,它是从.NET语言编译而成);用或至少修饰一个函数的
块, 是什么使它成为一个先进的;因此,它支持某些标准行为:参数(…)
- 您可以获得自动支持,例如
和-Verbose
,如果相应地实现了该功能,还可以自动支持-OutVariable
和-WhatIf
-Confirm
- 未绑定到显式声明的参数的参数会导致调用时出错
- 通常,但不一定,高级函数通过
脚本块,通过用进程{…}
和/或valuefrompipline
修饰的参数绑定参数,支持逐个管道输入处理valuefrompiplinebypropertyname
- 不幸的是,即使是高级函数和cmdlet也不是完全相同的:
- 高级函数在子变量范围内运行,与cmdlet不同
- 但是,通过
对象,即使在模块中放置的函数中也可以访问调用者的变量(对于模块之外的函数,由于PowerShell的动态作用域,调用者的变量在默认情况下是可见的),如中所示$PSCmdlet.SessionState.PSVariable
- 但是,通过
- 高级功能
- Windows PowerShell中的高级功能。
- 这种不一致性在PowerShell Core中得到了解决,但不幸的是,这种解决方式产生的问题比解决的问题多——请参阅GitHub问题和
- 高级函数在子变量范围内运行,与cmdlet不同
- 您可以获得自动支持,例如
- A相比之下:
- 是否适用于脚本和模块内部助手功能
- 需要更少的“仪式”(没有参数属性的更简单语法,单脚本块体)
- 但是,如果需要,仍然可以通过自动变量
或甚至通过$input
块处理管道输入处理{…}
- 默认情况下也在子作用域中运行;在模块之外(简单函数无论如何都不应该从中导出),调用方的变量由于PowerShell的动态作用域而可见;修改它们(通常应该避免)需要使用
调用-Scope 1
Set Variable
- 请注意,还有一个专门但很少使用的简单函数变体,它针对管道处理进行了优化,使用
关键字定义。它的主体对于每个管道输入对象都被隐式调用,反映在自动变量Filter
中$\uuu
虽然将函数作为模块的一部分导出——最好是通过其模块清单(
*.psd1
)——并不强制要求函数是高级函数,但最好只导出高级函数得到它。非常感谢。值得强调的是,许多社区模块提供的cmdlet都是以函数形式编写的,但其行为(从用户角度来看)与上述实际cmdlet完全相同。请注意,PowerShell团队已正式更改了cmdlet一词的定义,以包括“高级函数”等。看,我知道这是一个不同的问题,但我想在这里问它:@mazzy的名称是否有区别:不,这些高级函数的子类型没有特定的名称,但是那些实现支持shouldprocess
的函数获得了对-WhatIf
和-Confirm
公共参数的支持。“高级函数在子变量作用域中运行,与cmdlet不同”-True,但确实存在。