2016-05-03 9 views
2

私はそれが単純であるように感じるおもちゃの問題があります。私はパイプをサポートするJoin-Pathのような機能を持っていたいと思います。 Build-Pathと呼んでください。このように、(私のテスト1-4です)これらのステートメントは同等でなければなりません:PowerShell:位置パラメータとValueFromPipeline

Get-Location | Build-Path Test 

Get-Location | Build-Path -Right Test 

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

Build-Path (Get-Location) Test 

、私は多くのことを試みたが、私はこの2つの関数(相互に排他的)を得ることができ、最も近いました:

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:パイプラインパラメータには位置がなく、右の位置は0です。テスト4

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

を失敗した私は成功しません(私の試みを保存していない)いくつかの方法でParameterSetsを使用して試したと私は今困惑ビットです。

思考?

+0

'$ left | Join-Path -ChildPath $ right' < - Join-Pathはあなたが既に求めていることをしっかりとしています。 –

+0

@RyanBemroseはペダンティックに聞こえますが、位置パラメータ($ left | Join-path $ right)を使用しません –

+1

別問題:パイプライン入力を使用するときに本当に必要なプロセスブロックがありません。あなたはパイプラインで1つのオブジェクトしか使用していないので、それは明らかではありません。 –

答えて

3

これは、あなたが望むように動作しません。どちらの引数も同じデータ型で、パイプラインに入ったかどうかを調べる前にパラメータをバインドするために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 
関連する問題