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

[玩转系统] PowerShell 中的参数绑定概念

作者:精品下载站 日期:2024-12-14 08:09:10 浏览:14 分类:玩电脑

PowerShell 中的参数绑定概念


[玩转系统] PowerShell 中的参数绑定概念

参数绑定是 PowerShell 中的一个基本概念。而您如果您我最近亲身经历过,但并不完全理解这个概念。

就我而言,这是对高级功能的简单重新阅读和然后尝试一个简单的脚本来制作一个计算器,以重新测试我能记住多少。当我尝试从管道提供参数值时,问题就开始了。在这篇博文中,我将介绍两个基本的 PowerShell 管道参数绑定概念:“byValue ” 和 “ byProperty ”。

让我们 检查我对计算器程序的第一次尝试。 如下所示 它是用于对两个数字进行加、减、乘和除的简单 PowerShell 脚本(图 1a + 1b)。

[玩转系统] PowerShell 中的参数绑定概念

图 1a:简单计算器第 1 部分。函数名称:Get-Calculation;三个参数:$firstNumber、$secondNumber 和$operator。参数属性:强制并接受来自管道的值。运算符参数具有一组固定的值。

[玩转系统] PowerShell 中的参数绑定概念

图 1b:简单计算器第 2 部分。定义输出对象并将输出对象写入管道。

问题就从这里开始:当我尝试创建一个属性与函数参数相同的自定义对象并将其传递给管道中的 Get-Calculation 函数时,出现错误(图 3)。

[玩转系统] PowerShell 中的参数绑定概念

图 3:将自定义 PS 对象传递给 Get-Calculation

使用 Trace 命令进行故障排除

为了进一步理解和调试这个问题,我决定使用 Trace-Command cmdlet观察管道中参数绑定是如何发生的。我使用以下选项运行跟踪命令来观察参数绑定“ParameterBinderBase、ParameterBinderController、ParameterBinding”。下面的屏幕截图显示了 Trace-Command 的输出(图 4)。

[玩转系统] PowerShell 中的参数绑定概念

图 4:使用 Trace-Command 检查参数绑定

我们可以在图 5 中观察到,不是将对象属性绑定到参数,而是将“整个”对象 ($myObj) 作为值提供给参数。

[玩转系统] PowerShell 中的参数绑定概念

图 5:参数绑定

参数绑定:byValue 与 byProperty

发生这种情况是因为当我定义参数属性时,我决定设置“ValueFromPipeline=$True”,这会导致 Pipeline 绑定“byValue”。

“按值绑定”意味着传入对象将作为参数的值提供。管道不会处理该对象并将对象的特定属性绑定到参数中的下一个 cmdlet/函数。管道。如果我们观察 Trace-Command 的输出,管道正在尝试将我们的对象 ({firstNumber=1; secondaryNumber=4;operator=+}) 绑定到参数“第一个数字”等等。

解决方案是绑定“byProperty”。在我们的示例中,我们需要显式告诉管道将传入对象的属性绑定到我们的参数。如下所示,我们将原始脚本更改为通过Property 绑定(图6)。

[玩转系统] PowerShell 中的参数绑定概念

图 6:按属性接受值的参数属性

接下来,我们再次使用 Trace-Command 观察行为。这次我们可以看到,对象属性已正确绑定到我们的参数(图 7)。然而,有一个问题:为了使其正常工作,传入对象的属性应该与函数参数具有相同的名称。

[玩转系统] PowerShell 中的参数绑定概念

图7:参数绑定成功

测试:按值和按属性进行参数绑定

在同一程序的下一次迭代中,我们更改了参数以接受按值参数和按属性参数(图 8)。为了演示,我决定更改运算符参数并使其成为非强制参数,并为其指定默认值“+”。

[玩转系统] PowerShell 中的参数绑定概念

图 8:接受参数 byValue 和 byProperty

现在,我们的函数使用 byValuebyProperty 选项接受参数值。让我们举一个简单的例子,我们发送两个对象,一个为 Int 类型(图 9),另一个为自定义 PS 对象(图 10)。

[玩转系统] PowerShell 中的参数绑定概念

图 9:向 Get-Calculation 提供两个对象

我们得到 8 的第一个结果可能有点令人困惑,但程序对第二个对象按预期工作(如果您想知道运算符属性,我将把它作为作业留给您)。

我们将使用我们的好老朋友 Trace 命令来观察绑定。正如您在图 10 中所观察到的,第一个对象(Int 类型的数字 4)绑定到 firstNumber 和 SecondNumber,导致总和为 8。这表明管道将把同一个对象插入到从管道接受值的所有参数中。如果我们使用“byValue”选项。

[玩转系统] PowerShell 中的参数绑定概念

图 10:Int 对象的参数绑定

对于我们的 PS 自定义对象,我们可以观察到管道首先尝试绑定 byValue 但失败,然后如预期切换到 byProperty 选项并开始按属性名称绑定参数(图 11)。

[玩转系统] PowerShell 中的参数绑定概念

图 11:PS 自定义对象的参数绑定

结论

以下是这篇文章的一些要点:

  1. 参数绑定的默认选项是按值绑定。
  2. 如果我们同时选择了byValuebyProperty选项,管道将通过使用byValue选项进行绑定来启动。
  3. 如果参数直接提供给函数,则进程块只会执行一次。
  4. 如果参数由管道提供,则流程块针对管道中的每个对象执行一次。

希望这篇文章能够帮助您进一步理解并正确实现高级功能。

相关内容

  • PowerShell 脚本如何在 ScriptRunner 中工作 |脚本运行器

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

取消回复欢迎 发表评论:

关灯