【问题标题】:PowerShell: Positional Parameters and ValueFromPipelinePowerShell:位置参数和 ValueFromPipeline
【发布时间】:2016-05-03 23:03:06
【问题描述】:

我有一个玩具问题,感觉应该很简单。我想要一个像 Join-Path 这样支持管道的功能。称之为构建路径。因此,这些语句(这是我的测试 1-4)应该是等效的:

Get-Location | Build-Path Test

Get-Location | Build-Path -Right Test

Build-Path -Left (Get-Location) -Right Test

Build-Path (Get-Location) Test

我已经尝试了很多东西,最接近我可以得到这两个功能(互斥):

A:两个值的显式位置;未通过测试 1

function Build-Path
(
    [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)]
    [String] $Left, 
    [Parameter(Mandatory=$true, Position=1)]
    [String] $Right
)
{
    Join-Path $Left $Right
}

B:管道参数上没有位置,Right的位置为0;未通过测试 4

function Build-Path
(
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
    [String] $Left, 
    [Parameter(Mandatory=$true, Position=0)]
    [String] $Right
)
{
    Join-Path $Left $Right
}

我已尝试以多种方式使用 ParameterSets(没有保存我的尝试)但没有成功,我现在有点难过。

想法?

【问题讨论】:

  • $left | Join-Path -ChildPath $right
  • @RyanBemrose 听起来很迂腐,但不使用位置参数(即 $left | Join-Path $right)
  • 单独问题:您没有使用管道输入时真正需要的进程块。您只在管道中使用了一个对象,因此并不那么明显。
  • 最简单的解决方法?交换你的位置。你所拥有的一切都会起作用,你唯一需要改变的是#4,你必须交换参数顺序。

标签: powershell


【解决方案1】:

这不能按您希望的方式工作。您的两个参数都是相同的数据类型,PowerShell 将使用它来绑定参数,然后再查看它是否进入管道,并尝试立即填充从 0 开始的位置。

我什至尝试用参数集重做它:

function Build-Path {
[CmdletBinding(DefaultParameterSetName='Default',PositionalBinding=$false)]
param(
    [Parameter(
        ParameterSetName='Default',
        Mandatory=$true, 
        ValueFromPipeline=$true
    )]
    [Parameter(
        ParameterSetName='LooseyGoosey',
        Mandatory=$true,
        Position=0
    )]
    [String] 
    $Left, 

    [Parameter(
        ParameterSetName='Default',
        Mandatory=$true, 
        Position=0
    )]
    [Parameter(
        ParameterSetName='LooseyGoosey',
        Mandatory=$true,
        Position=1
    )]
    [String] 
    $Right
)

    Join-Path $Left $Right
}

要查看 PowerShell 如何绑定参数,请使用Trace-Command

Trace-Command -Name ParameterBinding -Expression { Build-Path (Get-Location) Test } -Verbose -PSHost

无论你怎么切,你都会遇到问题。没有DefaultParameterSet?无法解析参数集。切换默认值?然后,您只需更改哪些调用有效或无效。

您也不能将 -Right 参数设置为 [String[]] 数组,因为在绑定期间 PowerShell 会尝试强制执行,因此 [String] 仍将被接受和绑定。

DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Get-Location]
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Get-Location]
DEBUG: ParameterBinding Information: 0 : BIND cmd line args to DYNAMIC parameters.
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Get-Location]
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Build-Path]
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Build-Path]
DEBUG: ParameterBinding Information: 0 :     BIND arg [C:\Users\Briantist] to parameter [Right]
DEBUG: ParameterBinding Information: 0 :         Executing DATA GENERATION metadata: [System.Management.Automation.ArgumentTypeConverterAttribute]
DEBUG: ParameterBinding Information: 0 :             result returned from DATA GENERATION: C:\Users\Briantist
DEBUG: ParameterBinding Information: 0 :         BIND arg [C:\Users\Briantist] to param [Right] SKIPPED
DEBUG: ParameterBinding Information: 0 :     BIND arg [C:\Users\Briantist] to parameter [Left]
DEBUG: ParameterBinding Information: 0 :         Executing DATA GENERATION metadata: [System.Management.Automation.ArgumentTypeConverterAttribute]
DEBUG: ParameterBinding Information: 0 :             result returned from DATA GENERATION: C:\Users\Briantist
DEBUG: ParameterBinding Information: 0 :         BIND arg [C:\Users\Briantist] to param [Left] SKIPPED
DEBUG: ParameterBinding Information: 0 :     BIND arg [C:\Users\Briantist] to parameter [Right]
DEBUG: ParameterBinding Information: 0 :         Executing DATA GENERATION metadata: [System.Management.Automation.ArgumentTypeConverterAttribute]
DEBUG: ParameterBinding Information: 0 :             result returned from DATA GENERATION: C:\Users\Briantist
DEBUG: ParameterBinding Information: 0 :         BIND arg [C:\Users\Briantist] to param [Right] SKIPPED
DEBUG: ParameterBinding Information: 0 :     BIND arg [C:\Users\Briantist] to parameter [Right]
DEBUG: ParameterBinding Information: 0 :         Executing DATA GENERATION metadata: [System.Management.Automation.ArgumentTypeConverterAttribute]
DEBUG: ParameterBinding Information: 0 :             result returned from DATA GENERATION: C:\Users\Briantist
DEBUG: ParameterBinding Information: 0 :         COERCE arg to [System.String]
DEBUG: ParameterBinding Information: 0 :             Parameter and arg types the same, no coercion is needed.
DEBUG: ParameterBinding Information: 0 :         BIND arg [C:\Users\Briantist] to param [Right] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 :     BIND arg [Test] to parameter [Right]
DEBUG: ParameterBinding Information: 0 :         Executing DATA GENERATION metadata: [System.Management.Automation.ArgumentTypeConverterAttribute]
DEBUG: ParameterBinding Information: 0 :             result returned from DATA GENERATION: Test
DEBUG: ParameterBinding Information: 0 :         BIND arg [Test] to param [Right] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Build-Path]
DEBUG: ParameterBinding Information: 0 :     PROMPTING for missing mandatory parameters using the host

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 2022-01-28
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2015-05-21
    • 1970-01-01
    相关资源
    最近更新 更多