最近我的团队一直在进行这场辩论。我们需要创建一个Powershell模块,定义一些将在各种脚本中重用的函数。
一些团队成员认为模块中的公开函数应该将对象作为参数而不是2或3个基本类型参数。其他人争辩说,如果你看看Powershell的基本命令,虽然它们可能会返回对象,但它们从不将对象作为参数。
考虑到how tedious与“真实的面向对象”语言相比,操纵Powershell中的对象,您认为值得花费额外费用吗?是否有任何普遍接受的关于将对象作为输入的最佳实践?
一般来说,是Powershell设计时考虑到完全传统的面向对象,或者它的命令行性质是否必然会影响我们编写和使用Powershell代码的方式?
答案 0 :(得分:3)
其他人认为,如果你看看Powershell的基本命令,虽然它们可能会返回对象,但它们从不将对象作为参数。
那是垃圾。 Stop-Process
怎么样,这是我头脑中的第一个例子?您可以传递一个整数数组(进程ID' s),一个字符串数组(进程名称)或一个Process
对象数组:
语法
Stop-Process [-Id] <int[]> [-PassThru ] [-Force ] [-WhatIf ] [-Confirm ] [<CommonParameters>] Stop-Process -Name <string[]> [-PassThru ] [-Force ] [-WhatIf ] [-Confirm ] [<CommonParameters>] Stop-Process [-InputObject] <Process[]> [-PassThru ] [-Force ] [-WhatIf ] [-Confirm ] [<CommonParameters>]
或者Remove-Item
可能需要-Path
或-LiteralPath
个参数,但同样会接受任何具有Path
或LiteralPath
属性的对象。此外,与许多其他cmdlet一样,它具有-Credential
参数,该参数是pscredential
对象,可以在命令行上指定,也可以在管道对象上指定。
遵循其中一些标准cmdlet作为模型:cmdlet的主要参数通常是某个基元的数组,但也可以是管道中适当对象或对象数组的属性。如果有适当的对象,则将其作为参数集之一接受,但尝试使用其他参数集来允许命令自行运行。
其他参数(-Credential
是最明显的例子)可以作为对象使用。
答案 1 :(得分:1)
我会使用原始类型作为参数(KISS)。无论如何,内部Powershell将把所有东西变成PSObjects。无论你给它苹果还是橙子都没关系,它将是水果沙拉。
除此之外,随着云计算变得越来越普遍,远程管理变得越来越普遍,无论你使用什么,最终都会被串行化并发送到网络中。原始类型通常更有效和可预测地序列化,并且导致比dotnet对象小得多的有效载荷。
IMHO