gpt4 book ai didi

powershell - 如何确定仅在当前管道步骤中绑定(bind)的参数?

转载 作者:行者123 更新时间:2023-12-02 23:43:21 24 4
gpt4 key购买 nike

考虑以下脚本:

function g
{
[CmdletBinding()]
param
(
[parameter(ValueFromPipelineByPropertyName = $true)]$x,
[parameter(ValueFromPipelineByPropertyName = $true)]$y,
[parameter(ValueFromPipelineByPropertyName = $true)]$z
)
process
{
$retval = @{psbp=@{};mibp=@{};x=$x;y=$y;z=$z}
$PSBoundParameters.Keys |
% { $retval.psbp.$_ = $PSBoundParameters.$_ }
$PSCmdlet.MyInvocation.BoundParameters.Keys |
% { $retval.mibp.$_ = $PSCmdlet.MyInvocation.BoundParameters.$_}
return New-Object psobject -Property $retval
}
}

$list = (New-Object psobject -Property @{x=1;z=3}),
(New-Object psobject -Property @{x=$null;y=2} )
$list |
g |
Select bp,x,y,z |
ft -AutoSize

运行脚本会产生以下输出:
psbp      mibp      x y z
---- ---- - - -
{z, x} {z, x} 1 3
{y, z, x} {y, z, x} 2

这似乎表明 $PSBoundParameters$PSCmdlet.MyInvocation.BoundParameters包含到目前为止绑定(bind)的所有参数的累积。

我相当肯定 $x$z被绑定(bind)在第一步, $x$y绑定(bind)在第二步,但我还没有找到以编程方式检索该详细信息的方法。

如何确定仅在当前管道步骤中绑定(bind)的参数?

我为什么要关心这个?某些类型的参数验证比使用参数集等语言功能所能实现的更为复杂, ValidateScript()等。该验证必须在函数体内执行。有时需要考虑一个未绑定(bind)的参数在语义上与传递 $null 不同。到相同的参数。通常通过询问 $PSBoundParameters 来检测绑定(bind)参数。 .如果您在管道上仅传递一个参数对象,则此方法可以正常工作。但是,如果您使用管道传递参数对象列表,则由于上述脚本演示的问题,该检测会失败。这违反了最小意外原则,因为在 foreach 中运行良好的函数当调用者碰巧通过管道将相同的对象传递给它来调用它时,循环的行为会大不相同。

我可以通过从 foreach 中调用受影响的函数来解决这个问题。 ,但我宁愿解决所有调用的问题,也不愿完全放弃管道。

最佳答案

您可以记住begin 中所有受命令行限制的参数。 block ,然后在 process 结束 block 你可以清理$PSBoundParameters从当前输入对象限定的参数:

function g
{
[CmdletBinding()]
param
(
[parameter(ValueFromPipelineByPropertyName = $true)]$x,
[parameter(ValueFromPipelineByPropertyName = $true)]$y,
[parameter(ValueFromPipelineByPropertyName = $true)]$z
)
begin
{
$CommandLineBoundParameters=@($PSBoundParameters.Keys)
}
process
{
...

@($PSBoundParameters.Keys) |
? { $CommandLineBoundParameters -notcontains $_ } |
% { [void]$PSBoundParameters.Remove($_) }
}
}

关于powershell - 如何确定仅在当前管道步骤中绑定(bind)的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34032902/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com