极客学校:学习如何在PowerShell中使用对象

了解对象是“获取”PowerShell的基本概念之一。和我们一起探索对象,以及它们如何让PowerShell变得比当今任何其他外壳都更好。

请务必阅读本系列的前几篇文章:

了解如何使用PowerShell自动化Windows。 学习在PowerShell中使用Cmdlet

在接下来的一周里,我们将继续关注这一系列的节目。

客体

您有没有想过PowerShell与传统的Linux shell(如Bash,甚至传统的命令提示符)有什么不同?答案非常简单:传统的shell输出文本,这使得格式化和过滤等操作变得困难。当然,有一些工具可以帮助您完成工作(浮现在脑海中的是sed和grep),但归根结底,如果您想要进行任何类型的繁重文本解析,您需要对正则表达式了如指掌。

PowerShell利用了底层的.Net框架,并采取了一种不同的方法,使用对象而不是文本。对象只是某物的一种表现形式。它们是部件和使用它们的动作的集合。让我们来看看自行车的部件以及我们可能如何使用它们。

Net中的对象基本相同,除了两个小区别:“部分”称为属性,“指令”称为方法。如果我们希望将Windows服务表示为对象,我们可能会决定使用三个属性来描述它是合适的:服务名称、状态和描述。我们还需要与服务交互,因此我们可能会为对象提供Start、Stop和Pause方法。

通过将对象传递给Get-Member cmdlet,可以查看对象的属性和方法。PowerShell cmdlet输出的对象在很大程度上是.Net Framework的基础类型,但如果需要使用C#之类的语言或使用PSObject类型,您可以创建自己的对象。

“管道”(The Pipeline)

有很多带有管道的Linux shell,允许您将一个命令输出的文本作为输入发送到管道中的下一个命令。PowerShell允许您获取一个cmdlet输出的对象,并将它们作为输入传递给管道中的下一个cmdlet,从而使这一点更上一层楼。诀窍在于了解cmdlet返回的对象类型,这在使用Get-Member cmdlet时非常容易。

由于超出本文范围的原因,属性和方法被联合称为类成员,这解释了您为什么使用Get-Member cmdlet来获取对象具有的所有方法和属性的列表。但是,Get成员cmdlet还返回另一条重要信息,即基础对象类型。在上面的屏幕截图中,我们可以看到Get-Service返回以下类型的对象:

由于PowerShell处理的是对象而不是文本,因此并不是所有的cmdlet都可以使用管道链接在一起[1]。这意味着我们需要查找要从管道接受System.ServiceProcess.ServiceController对象的cmdlet。

请注意,有一个名为Stop-Service的cmdlet;让我们来看看它的帮助。

看起来InputObject参数接受ServiceController对象数组作为输入。通常,如果您看到一个名为InputObject的参数,它将接受来自管道的输入,但为了确保让我们看看该参数的完整帮助。

我们的怀疑是正确的。因此,在这一点上,我们知道以下内容:

Get-Service返回ServiceController对象。 Stop-Service有一个名为InputObject的参数,该参数接受一个或多个ServiceController作为输入。 InputObject参数接受管道输入。

使用此信息,我们可以执行以下操作:

各位,这次就到这里吧。下一次我们将了解如何格式化、筛选和比较管道中的对象。

家庭作业 / 准备工作 / 预先所做的研究 / 在家里做的工作

阅读对象管道

如果你有任何问题,可以发tweet给我@taabgibb,或者直接留言。

相关文章