Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop Powershell模块/脚本是否应接受对象作为输入?_Oop_Powershell - Fatal编程技术网

Oop Powershell模块/脚本是否应接受对象作为输入?

Oop Powershell模块/脚本是否应接受对象作为输入?,oop,powershell,Oop,Powershell,最近在我的团队里发生了这样的争论。我们需要创建一个Powershell模块,定义一些将在各种脚本中重用的函数 一些团队成员认为模块中公开的函数应该将对象作为参数,而不是2或3个基本类型参数。另一些人认为,如果您查看Powershell的基本命令,虽然它们可能返回对象,但它们从不将对象作为参数 考虑到与“真正的面向对象”的语言相比,在Powershell中操作对象是一件非常困难的事情,您认为这值得付出额外的成本吗?关于将对象作为输入,是否有公认的最佳实践 一般来说,Powershell是否在设计时

最近在我的团队里发生了这样的争论。我们需要创建一个Powershell模块,定义一些将在各种脚本中重用的函数

一些团队成员认为模块中公开的函数应该将对象作为参数,而不是2或3个基本类型参数。另一些人认为,如果您查看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
是最明显的例子)与对象一样好