2017-12-18 5 views
1

Ich habe ein Problem beim Erstellen einer Funktion mit mehreren Parametern in PowerShell. Ich habe 4 Parameter, und ihr Wert kann und wird entweder über Pipeline oder über direkte Eingabe in einem PowerShell-Fenster übergeben.Mehrere Parameter mit Pipeline oder direkter Eingabe

Ich kann nicht herausfinden, wie Sie sicherstellen, dass die 4 Parameter im Prozessabschnitt verwendet werden können.

Hier ist, was ich habe (der Write-Host Abschnitt nur zum Testen ist, natürlich):

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" 
    } 

Wenn ich diese verwenden, funktioniert es mit Pipeline-Eingang in Ordnung, aber nicht mit Eingangsgleichbefehlszeile, das heißt:

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

ich erhalte

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

ich weiß, dass in der Regel, zu unterstützen sowohl direkte Eingabe und Pipeline-Eingabe, müssen Sie eine foreach Schleife in der process Abschnitt hinzufügen, aber wie würde ich über eine foreach Schleife mit mehreren Parametern gehen?

Antwort

1

ValuefromPipelineByPropertyName bedeutet, dass Sie Eigenschaften mit dem gleichen Namen in dem Objekt haben müssen, das Sie an die Eingabe übergeben. Auch die Art der Parameter muss nicht Array sein. Sie können die Funktion auf diese Weise ändern:

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"} 
} 

Und Test:

@([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 

Dies wäre das Ergebnis:

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

Dank! Sowohl Ansgar als auch Sie hatten fast die gleiche Antwort hehe Aber Ihre, indem Sie benutzerdefinierte Objekte verwenden, hilft mir sehr viel weiter unten, da ich diese Werte speziell für den Aufbau neuer VMs in VMware verwenden werde. Danke für Ihre Hilfe! :) –

+0

Gern geschehen :) –

2

Parameter funktionieren nicht so. Wenn Sie die Eingabe über die Pipeline übergeben, erhält jeder Parameter einen Wert (für jedes verarbeitete Objekt). In Ihrem Befehlszeilenaufruf übergeben Sie alle Werte zur gleichen Zeit, aber die Indizes der einzelnen Parameter-Arrays haben keine Beziehung zueinander, es sei denn, Sie implementieren dies in Ihrer Funktion. Wie sollte PowerShell andernfalls eine Funktion mit (zum Beispiel) zwei Parametern behandeln, die ein String-Array und eine einfache Zeichenfolge erwarten? Verarbeiten Sie das Array und den einfachen Wert gleichzeitig? Jeder Array-Index zusammen mit einer Kopie der einfachen Zeichenfolge? Der erste Index mit der einfachen Zeichenfolge und der Rest mit Nullwerten? Etwas anderes?

Was können Sie tun, ist eine Liste von Hash-Tabellen erstellen und diese in einer Schleife vollzuspritzen:

$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 @_ } 

obwohl ich nicht sicher bin, dass Sie gewinnen würde, irgendeinen Vorteil gegenüber benutzerdefinierte Objekte zu bauen und sie Pipelining.

Verwandte Themen