about_Parameter_Binding
参数绑定是 PowerShell 用来确定正在使用哪个参数集并将 (bind) 值与命令的参数相关联的过程。 这些值可能来自命令行和数据管道。
参数绑定过程从绑定命令行参数开始。
绑定命名参数
在命令行中查找以破折号开头的未加引号的令牌。 如果令牌以冒号结尾,则需要一个参数。 如果没有冒号,请查看参数的类型,并查看参数是否是必需的。 如果一个值是必需的,请尝试将参数的类型转换为参数所需的类型,转换成功时再绑定参数。
绑定位置参数
如果有任何未使用的命令行参数,请查找需要位置参数的未绑定参数,并尝试绑定这些参数。
绑定命令行参数后,PowerShell 会尝试绑定任何管道输入。 可通过两种方式从管道绑定值。 接受管道输入的参数具有以下一个或两个属性:
- ValueFromPipeline - 管道中的值根据其类型绑定到参数。 参数的类型必须与形参的类型匹配。
- ValueFromPipelineByPropertyName - 管道中的值根据其名称绑定到参数。 管道中的对象必须具有与参数的名称或其别名之一匹配的属性。 属性的类型必须匹配或可转换为参数的类型。
PowerShell 按以下顺序尝试绑定管道输入:
尝试在没有类型转换的情况下绑定
ValueFromPipeline
参数:通过具有精确类型匹配的值从管道绑定。 如果命令具有管道输入,并且仍有未绑定的参数,请尝试绑定到与类型完全匹配的参数。
尝试在没有类型转换的情况下绑定
ValueFromPipelineByPropertyName
参数:如果没有找到匹配的值,那么使用精确匹配的名称从管道绑定。 查找与参数名称或其别名之一匹配的输入对象的属性。 如果类型完全匹配,请绑定参数。
如果管道输入尚未绑定,请尝试通过类型转换来绑定
ValueFromPipeline
参数。尝试将管道输入转换为所需类型。 如果转换失败,则参数未绑定。
如果管道输入尚未绑定,请尝试通过类型转换来绑定
ValueFromPipelineByPropertyName
参数。属性的名称必须与参数的名称或其别名之一匹配。 如果输入类型不匹配,请尝试将输入转换为匹配类型。 如果转换失败,则参数未绑定。
排查参数绑定问题可能很困难。 可以使用 Trace-Command cmdlet 可视化参数绑定过程。 以下示例演示如何跟踪简单管道的参数绑定。
Trace-Command -PSHost -Name ParameterBinding -Expression {
Get-Item *.txt | Remove-Item
}
输出显示 表达式中命令的参数绑定过程的每个步骤。 输出可能很详细,但它可以帮助你了解参数未按预期绑定的原因。 有关完整示例,请参阅 可视化参数绑定 一文。