Oop Powershell模块/脚本是否应接受对象作为输入?
最近在我的团队里发生了这样的争论。我们需要创建一个Powershell模块,定义一些将在各种脚本中重用的函数 一些团队成员认为模块中公开的函数应该将对象作为参数,而不是2或3个基本类型参数。另一些人认为,如果您查看Powershell的基本命令,虽然它们可能返回对象,但它们从不将对象作为参数 考虑到与“真正的面向对象”的语言相比,在Powershell中操作对象是一件非常困难的事情,您认为这值得付出额外的成本吗?关于将对象作为输入,是否有公认的最佳实践Oop Powershell模块/脚本是否应接受对象作为输入?,oop,powershell,Oop,Powershell,最近在我的团队里发生了这样的争论。我们需要创建一个Powershell模块,定义一些将在各种脚本中重用的函数 一些团队成员认为模块中公开的函数应该将对象作为参数,而不是2或3个基本类型参数。另一些人认为,如果您查看Powershell的基本命令,虽然它们可能返回对象,但它们从不将对象作为参数 考虑到与“真正的面向对象”的语言相比,在Powershell中操作对象是一件非常困难的事情,您认为这值得付出额外的成本吗?关于将对象作为输入,是否有公认的最佳实践 一般来说,Powershell是否在设计时
一般来说,Powershell是否在设计时考虑到了完全传统的面向对象,或者它的命令行特性是否一定会使我们编写和使用Powershell代码的方式变得非常糟糕?我倾向于使用基元类型作为参数(KISS)。在内部,Powershell将把所有东西都转换成PSObject。不管你给它苹果还是橘子,它都是水果沙拉 除此之外,随着云计算变得越来越普遍,远程管理成为常态,无论您使用什么,最终都很可能被序列化并发送出去。基本类型通常更高效、更可预测地序列化,并产生比dotnet对象小得多的有效负载
IMHO我赞成使用原语类型作为参数(KISS)。在内部,Powershell将把所有东西都转换成PSObject。不管你给它苹果还是橘子,它都是水果沙拉 除此之外,随着云计算变得越来越普遍,远程管理成为常态,无论您使用什么,最终都很可能被序列化并发送出去。基本类型通常更高效、更可预测地序列化,并产生比dotnet对象小得多的有效负载 伊姆霍 另一些人认为,如果您查看Powershell的基本命令,虽然它们可能返回对象,但它们从不将对象作为参数 那是垃圾。我脑海中浮现的第一个例子是停止进程,怎么样?您可以向其传递整数数组(进程id)、字符串数组(进程名称)或
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>]
停止进程[-Id][-PassThru][-Force][-WhatIf][-Confirm][]
停止进程-名称[-PassThru][-Force][-WhatIf][-Confirm][]
停止进程[-InputObject][-PassThru][-Force][-WhatIf][-Confirm][]
或者,删除项
,该项接受-Path
或-LiteralPath
参数,但同样接受具有路径
或LiteralPath
属性的任何对象。此外,与许多其他cmdlet一样,它有一个-Credential
参数,该参数是pscredential
对象,可以在命令行上指定,也可以在管道对象上指定为属性
遵循以下一些标准cmdlet作为模型:cmdlet的主要参数通常是某个基元的数组,但也可以是管道中相应对象的属性或对象数组。如果存在适当的对象,则将其作为参数集之一接受,但尝试使用其他参数集允许命令自行运行
其他参数(-Credential
是最明显的例子)与对象一样好
另一些人认为,如果您查看Powershell的基本命令,虽然它们可能返回对象,但它们从不将对象作为参数
那是垃圾。我脑海中浮现的第一个例子是停止进程,怎么样?您可以向其传递整数数组(进程id)、字符串数组(进程名称)或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>]
停止进程[-Id][-PassThru][-Force][-WhatIf][-Confirm][]
停止进程-名称[-PassThru][-Force][-WhatIf][-Confirm][]
停止进程[-InputObject][-PassThru][-Force][-WhatIf][-Confirm][]
或者,删除项
,该项接受-Path
或-LiteralPath
参数,但同样接受具有路径
或LiteralPath
属性的任何对象。此外,与许多其他cmdlet一样,它有一个-Credential
参数,该参数是pscredential
对象,可以在命令行上指定,也可以在管道对象上指定为属性
遵循以下一些标准cmdlet作为模型:cmdlet的主要参数通常是某个基元的数组,但也可以是管道中相应对象的属性或对象数组。如果存在适当的对象,则将其作为参数集之一接受,但尝试使用其他参数集允许命令自行运行
其他参数(-Credential
是最明显的例子)与对象一样好