2017-12-18 22 views
1

ここでは、PowerShellで複数のパラメータを持つ関数を作成する際に問題が発生しています。私は4つのパラメータを持っていて、それらの値はPowerShellウィンドウのパイプラインまたは直接入力を介して渡すことができます。パイプラインまたは直接入力の複数のパラメータ

4つのパラメータをプロセスセクションで使用できるようにする方法がわかりません。ここで

は( Write-Hostセクションはもちろん、唯一のテストのためである)私が持っているものです。

function Set-NewDevEnv { 
    [CmdletBinding()] 
    Param(
     [Parameter(Mandatory=$true, ValuefromPipelineByPropertyName=$true)] 
     [ValidateSet('IIS', 'SQL', 'SOLR', 'Vanilla')] 
     [string[]]$VMType, 
     [Parameter(Mandatory=$true, ValuefromPipelineByPropertyName=$true)] 
     [string[]]$StaticIP, 
     [Parameter(Mandatory=$true, ValuefromPipelineByPropertyName=$true)] 
     [string[]]$VMName, 
     [Parameter(Mandatory=$true, ValuefromPipelineByPropertyName=$true)] 
     [string[]]$VMDNSName 
    ) 

    Begin {} 

    Process { 
     Write-Host "VMType is $VMType ; StaticIP is $StaticIP ; VMName is $VMName; and VMDNSName is $VMDNSName" 
    } 

私はこれを使用する場合は、直接コマンドライン入力、すなわちでパイプライン入力で正常に動作しますが、ありません。

Set-NewDevEnd -VMType "SQL","IIS" -StaticIp "192.168.0.1","192.168.0.2" -VMName "Testing1","Testing2" -VMDNSName "Testing1","Testing2" 

私は通常、サポートすることを知っている

 
VMType is SQL IIS ; StaticIP is 192.168.0.1 192.168.0.2 ; VMName is Testing1 Testing2 ; and VMDNSName is Testing1 Testing2 

を取得しています直接入力とパイプライン入力の両方で、foreachループをprocessセクションに追加する必要がありますが、複数のパラメータを使用してforeachループを使用するにはどうすればよいですか?

答えて

1

ValuefromPipelineByPropertyNameは、入力するオブジェクトに同じ名前のプロパティを持つ必要があることを意味します。また、パラメータの型は配列である必要はありません。あなたは機能をこのように変更することができます。

Function Set-NewDevEnv { 
    [cmdletbinding()] 
    param (
     [Parameter(Mandatory=$true,ValuefromPipelineByPropertyName=$true)] 
     [ValidateSet('IIS','SQL','SOLR','Vanilla')] 
     [string]$VMType, 
     [Parameter(Mandatory=$true,ValuefromPipelineByPropertyName=$true)] 
     [string]$StaticIP, 
     [Parameter(Mandatory=$true,ValuefromPipelineByPropertyName=$true)] 
     [string]$VMName, 
     [Parameter(Mandatory=$true,ValuefromPipelineByPropertyName=$true)] 
     [string]$VMDNSName 
    ) 

    begin {"Test Begin"} 
    process { 
     Write-Host "VMType is $VMType ; StaticIP is $StaticIP ;" + ` 
     "VMName is $VMName; and VMDNSName is $VMDNSName" 
    } 
    end {"Test End"} 
} 

とテストへ:

@([pscustomobject]@{ 
    VMType = "SQL"; 
    StaticIP = "192.168.0.1"; 
    VMName = "Testing1"; 
    VMDNSName= "Testing1"; }, 
    [pscustomobject]@{ 
    VMType = "IIS"; 
    StaticIP = "192.168.0.2"; 
    VMName = "Testing2"; 
    VMDNSName= "Testing2";}) | Set-NewDevEnv 

これは、結果、次のようになります。

Test Begin 
VMType is SQL ; StaticIP is 192.168.0.1 ; VMName is Testing1; and VMDNSName is Testing1 
VMType is IIS ; StaticIP is 192.168.0.2 ; VMName is Testing2; and VMDNSName is Testing2 
Test End 
+0

ありがとう! Ansgarとあなたはどちらも同じ答えを得ていましたが、カスタムオブジェクトを使用することで、私はVMwareの新しいVMを構築するためにこれらの値を特に呼び出すことにします。ご協力いただきありがとうございます! :) –

+0

あなたは大歓迎です:) –

2

パラメータはそのようには機能しません。入力をパイプライン経由で渡しているときは、各パラメータは一度に(処理されるオブジェクトごとに)1つの値を取得します。あなたのコマンドライン呼び出しでは、同時にすべての値を渡していますが、個々のパラメータ配列のインデックスは、関数内で実装しない限り、互いに関係しません。それ以外の場合、PowerShellは、文字列配列と単純な文字列を必要とする(たとえば)2つのパラメータを持つ関数をどのように扱うべきですか?アレイと単純な値を同時に処理しますか?各配列のインデックスは、単純な文字列のコピーと一緒に?単純な文字列の最初のインデックスと残りの値はヌル値ですか?他に何か?あなたは何ができるか

は、ハッシュテーブルのリストを作成し、ループ内でそれらをスプラットです:

$data = @{ 
    'VMType' = 'SQL' 
    'StaticIP' = '192.168.0.1' 
    'VMName' = 'Testing1' 
    'VMDNSName' = 'Testing1' 
}, 
@{ 
    'VMType' = 'IIS' 
    'StaticIP' = '192.168.0.2' 
    'VMName' = 'Testing2' 
    'VMDNSName' = 'Testing2' 
} 

$data | ForEach-Object { Set-NewDevEnv @_ } 

私はそれがあなたのカスタムオブジェクトを構築し、それらをパイプラインの上に任意の優位性を得るだろうかわからないが。

関連する問題