2017-06-26 4 views
2

Ich möchte zur Eingabe von Optionen aus einer programmgesteuerten Liste.Powershell verwenden Array als Parameter

Hintergrund: Ich habe 2 AWS-Konten mit verschiedenen Umgebungen. Das Skript erkennt automatisch, in welchem ​​Konto Sie sich befinden, und es sollte dann gefragt werden, an welcher Umgebung Sie teilnehmen möchten.

Ich versuche dies:

$envs = " 
1,Dev 
1,Test 
1,Demo 
2,Staging 
2,Production 
" | ConvertFrom-Csv -Delimiter "," -header "awsAccount","Environment" 

$awsAccount = Determine-awsAccount 

$envs = ([string]($allServers.Environment | Where-Object -property awsAccount -eq $awsAccount | Sort-Object | Get-unique)).replace(" ",",") 

$title = "Deploy into which environment" 
$message = "Please select which environment you want to deploy into" 
$options = [System.Management.Automation.Host.ChoiceDescription[]]($envs) 
$result = $host.ui.PromptForChoice($title, $message, $options, 0) 

Sie können ein Pop-up-Optionen $options = [System.Management.Automation.Host.ChoiceDescription[]]("yes","no")

Aber in meinem Fall mit schaffen es Aufspringen eine Option, um alle meine Umgebungen enthalten, die durch Kommas getrennt . Ich möchte, dass es für jede (relevante) Umgebung eine Option gibt.

Wie kann ich die String-Liste der Umgebungen wieder aus der PowerShell-Welt in die PowerShell-Welt nach außen verschieben?

Antwort

1

Ich lese Ihre Frage:

Wenn awsAccount 1 relevant ist, geben Sie die Optionen für awsAccount 1 (Dev, Test, Demo)“

Wenn awsAccount 2 relevant ist, geben die Optionen für awsAccount 2 (Demo, Staging, Produktion)“ist

Haupt Änderung Ihrer $envs = ([string](.. Linie. Ich habe eine neue Variable $envsToDisplayInPrompt verwendet, um eine Verwechslung mit Original $envs zu vermeiden.

Code:

$envs = " 
1,Dev 
1,Test 
1,Demo 
2,Staging 
2,Production 
" | ConvertFrom-Csv -Delimiter "," -header "awsAccount","Environment" 

#$awsAccount = Determine-awsAccount 
$awsAccount = 1 # assuming Determine-awsAccount returns an integer 1 or 2 

#$envs = ([string]($allServers.Environment | Where-Object -property awsAccount -eq $awsAccount | Sort-Object | Get-unique)).replace(" ",",") 
$envsToDisplayInPrompt = @(($envs | Where-Object {$_.awsAccount -eq $awsAccount}).Environment) 

$title = "Deploy into which environment" 
$message = "Please select which environment you want to deploy into" 
$options = [System.Management.Automation.Host.ChoiceDescription[]]($envsToDisplayInPrompt) 
$result = $host.ui.PromptForChoice($title, $message, $options, 0) 

Ausgang:

Prompt output

+0

Das ist genial. Also ist die Hauptänderung, dass Sie eine andere Art von Variablen verwendet haben? Ich kann sehen, dass es funktioniert, aber ich kann nicht sehen wie. –

+0

Ich habe die Bedingung in $ _ geändert. AwsAccount - wie "*" + $ awsAccount + "*", damit es funktioniert. –

+0

@RichardMoore Froh, hier funktioniert es. Die wichtigste Änderung ist die Zeile '$ envs = ([string] (..' da ich nicht davon überzeugt bin, dass das von $ $ options = ... benötigte String-Array korrekt zurückgegeben wird.) Sie können dies mit 'Write 'testen -Host $ env_ _nach dieser Zeile und sehen, was es druckt.Verwenden Sie den gleichen Variablennamen ist in Ordnung, ich verwende andere für die Klarheit. – gms0ulman

Verwandte Themen