当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 了解 PowerShell 管道参数绑定

作者:精品下载站 日期:2024-12-14 07:31:50 浏览:15 分类:玩电脑

了解 PowerShell 管道参数绑定


这篇文章应该让您对管道对象的处理方式有一个基本的了解。管道技术允许命令之间建立某种连接。管道是PowerShell中的一项关键技术。在这篇博文中,我将看看管道“右侧”的参数绑定。为了做到这一点,我将使用 cmdlet Trace-Command 来探索当对象从左侧传递到右侧管道时发生的情况。让我们开始吧。

介绍

首先,我向您简要介绍一下使用管道时发生的情况。我准备了一张图片来展示 PowerShell 中管道的机制。

[玩转系统] 了解 PowerShell 管道参数绑定

现在的问题是 Stop-Process 的哪个参数是管道绑定的对象?让我们检查一下哪些参数支持管道输入。我们可以使用 Get-Help 轻松解决这个问题。


Get-Help Stop-Process -Parameter * | Where-Object pipelineinput -Like 'true*'

[玩转系统] 了解 PowerShell 管道参数绑定

了解 PowerShell 管道绑定

我们首先探讨一下 PowerShell 如何绑定管道对象的最明显的方式。 PowerShell 获取来自管道左侧的对象,然后将此对象绑定到接受进程对象的参数。

例如,InputObject 只期望并接受进程对象。


Get-Help Stop-Process -Parameter InputObject

[玩转系统] 了解 PowerShell 管道参数绑定

这意味着需要进程对象,并且我们需要在管道的左侧提供该对象。然后,PowerShell 会将进程对象按值绑定到参数InputObject。下面的屏幕显示了操作。

[玩转系统] 了解 PowerShell 管道参数绑定

Trace-Command cmdlet 提供了这种情况确实发生的证据。


Trace-Command -Name ParameterBinding -Expression {Get-Process notepad | Stop-Process} -PSHost

[玩转系统] 了解 PowerShell 管道参数绑定

好的。管道左侧的对象已绑定到 InputObject 参数。

接下来,让我们看看当通过管道的对象不是进程对象时会发生什么……

[玩转系统] 了解 PowerShell 管道参数绑定

错误消息显示...

输入对象无法绑定到命令的任何参数,因为该命令不接受管道输入,或者输入及其属性与接受管道输入的任何参数都不匹配。

嘿,那是错误的!我们实际上有 3 个接受管道输入的参数……这是怎么回事?

请记住,我们有三个参数。它们都无法处理管道对象“记事本”,我们现在将了解原因。为了澄清起见,让我向您展示“记事本”的对象类型:

[玩转系统] 了解 PowerShell 管道参数绑定

记事本是一个字符串。

除此之外,PowerShell 尝试将参数绑定到 Name 参数。但是,名称参数仅接受 Name 对象字符串。 “notepad”不是名称对象。下图显示,正如我所预言的那样。 Powershell 不会尝试将字符串绑定到 Name 参数或 id 参数。


Trace-Command -Name ParameterBinding -Expression {'notepad' | Stop-Process} -PSHost

[玩转系统] 了解 PowerShell 管道参数绑定

现在我们如何才能让 PowerShell 接受字符串 (PSCostumObject) 记事本?答案是我们需要将 Notepad 设为 Name 对象。


$a=Get-Process -Name notepad | Select-Object -Property Name

[玩转系统] 了解 PowerShell 管道参数绑定

请注意当前记事本对象与前一个记事本对象之间的区别。

[玩转系统] 了解 PowerShell 管道参数绑定

美好的。记事本的属性名称现在与参数名称“Name”匹配。

现在我们可以通过管道将该对象传递给 Stop-Process。


$a | Stop-Process

[玩转系统] 了解 PowerShell 管道参数绑定

使用 Trace-Command 我们可以再次检查 PowerShell 做了什么。 PowerShell 已将管道对象绑定到 Name 参数,因为管道对象属性名称与“Name”参数名称匹配。

[玩转系统] 了解 PowerShell 管道参数绑定

我希望我能对这个话题有一个很好的见解,下次再见!

链接

https://devblogs.microsoft.com/scripting/learn-about-using-powershell-value-binding-by-property-name/

https://blogs.technet.microsoft.com/askpfeplat/2016/11/21/two-ways-to-accept-pipeline-input-in-powershell/

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯