2016-12-20 5 views
3

デバイスIDまたは表示名のいずれかを渡して、それを処理する機能が必要です。次の例で2つの「パイプラインから受け入れる」パラメータを持つ関数

、私は、デバイスID($obj.ID | Test-Function)が含ま顧客PowerShellのオブジェクトを渡したが、$DisplayName$Idの両方がその値で終わります。

どのようにして正しいパラメータに値を強制しますか?

function Test-Function { 
[CmdletBinding()] 
    Param (
     [Parameter(
      Mandatory=$true, 
      ValueFromPipeline=$true, 
      ValueFromPipelineByPropertyName=$true 
     )] 
     [string]$DisplayName 

     [Parameter(
      Mandatory=$true, 
      ValueFromPipeline=$true, 
      ValueFromPipelineByPropertyName=$true 
     )] 
     [string]$Id 
    ) 
    Begin { 
     #Code goes here 
    } 
    Process { 
     Write-Host "displayname is: $DisplayName" -ForegroundColor Green 
     Write-Host "displayname is: $Id" -ForegroundColor Green   
    } 
} 

答えて

3

これはParameterSetsで解決できます。

[PsCustomObject]@{Id = "hello"} | Test-Function 

出力::

displayname is: 
Id is: hello 

[PsCustomObject]@{DisplayName = "hello"} | Test-Function 

function Test-Function 
{ 
[CmdletBinding()] 
    Param (
     [Parameter(
      Mandatory=$true, 
      ValueFromPipeline=$true, 
      ValueFromPipelineByPropertyName=$true, 
      ParameterSetName='DisplayName' 
     )] 
     [string]$DisplayName, 


     [Parameter(
      Mandatory=$true, 
      ValueFromPipeline=$true, 
      ValueFromPipelineByPropertyName=$true, 
      ParameterSetName='Id' 
     )] 
     [string]$Id 
    ) 
    Begin { 
     #Code goes here 
    } 
    Process { 
     Write-Host "displayname is: $DisplayName" -ForegroundColor Green 
     Write-Host "Id is: $Id" -ForegroundColor Green   
    } 
} 

はそれを試してみることができます:私はまた、あなたのコードにコンマとWrite-Host出力を一定に注意してください

出力

displayname is: hello 
Id is: 
+0

私は非常にエレガントなこのソリューションを、好き。私はそれがあなたのためにどのように機能するかを見ていますが、私がテストオブジェクトを別々に作成すると、うまくいきません。私はNew-Objectコマンドレットを使ってオブジェクトを作成しています( '$ props = @ {Id = '1'; DisplayName = 'server1'}; $ object = new-object pscustomeobject -Property $ props') $ object.Id |テスト関数 '_Parameter setは指定された名前付きパラメータを使用して解決できません._何か間違っている必要があります。 – StackExchangeGuy

3

正解があるのでちょうどValueFromPipelineを削除し、Mandatory属性のための$ falseを設定します。

function Test-Function { 
[CmdletBinding()] 
    Param (
     [Parameter(
      Mandatory=$false, 
      ValueFromPipelineByPropertyName=$true 
     )] 
     [string]$DisplayName, 

     [Parameter(
      Mandatory=$false, 
      ValueFromPipelineByPropertyName=$true 
     )] 
     [string]$Id 
    ) 
    Begin { 
     #Code goes here 
    } 
    Process { 
     Write-Host "displayname is: $DisplayName" -ForegroundColor Green 
     Write-Host "displayname is: $Id" -ForegroundColor Green   
    } 
} 
+0

これにより、意図していないパラメータを使用せずにTest-Functionを呼び出すことができます。それに加えて、あなたの解決策が働いています。 –

+0

あなたはそうです。このテストは機能的に、またはあなたの答えを使って行うことができます; – TWEESTY

+0

とにかく有効な答えとそれより良いかもしれません。こうして上書きされる。 –

関連する問題