Powershell模块/脚本应该接受对象作为输入吗?

时间:2014-03-28 11:28:21

标签: oop powershell

最近我的团队一直在进行这场辩论。我们需要创建一个Powershell模块,定义一些将在各种脚本中重用的函数。

一些团队成员认为模块中的公开函数应该将对象作为参数而不是2或3个基本类型参​​数。其他人争辩说,如果你看看Powershell的基本命令,虽然它们可能会返回对象,但它们从不将对象作为参数。

考虑到how tedious与“真实的面向对象”语言相比,操纵Powershell中的对象,您认为值得花费额外费用吗?是否有任何普遍接受的关于将对象作为输入的最佳实践?

一般来说,是Powershell设计时考虑到完全传统的面向对象,或者它的命令行性质是否必然会影响我们编写和使用Powershell代码的方式?

2 个答案:

答案 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个参数,但同样会接受任何具有PathLiteralPath属性的对象。此外,与许多其他cmdlet一样,它具有-Credential参数,该参数是pscredential对象,可以在命令行上指定,也可以在管道对象上指定。

遵循其中一些标准cmdlet作为模型:cmdlet的主要参数通常是某个基元的数组,但也可以是管道中适当对象或对象数组的属性。如果有适当的对象,则将其作为参数集之一接受,但尝试使用其他参数集来允许命令自行运行。

其他参数(-Credential是最明显的例子)可以作为对象使用。

答案 1 :(得分:1)

我会使用原始类型作为参数(KISS)。无论如何,内部Powershell将把所有东西变成PSObjects。无论你给它苹果还是橙子都没关系,它将是水果沙拉。

除此之外,随着云计算变得越来越普遍,远程管理变得越来越普遍,无论你使用什么,最终都会被串行化并发送到网络中。原始类型通常更有效和可预测地序列化,并且导致比dotnet对象小得多的有效载荷。

IMHO