2017-06-26 2 views
2

Je souhaite demander des options à partir d'une liste générée par programme. Contexte: J'ai 2 comptes AWS contenant des environnements différents. Le script détecte automatiquement le compte dans lequel vous vous trouvez, puis il vous demande quel environnement vous souhaitez rejoindre.powershell utilise le tableau en tant que paramètres

J'essaie ceci:

$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) 

Vous pouvez créer un pop-up options à l'aide $options = [System.Management.Automation.Host.ChoiceDescription[]]("yes","no")

Mais dans mon cas, il est apparaître une option contenant tous mes environnements, séparés par des virgules . Je veux qu'il apparaisse une option pour chaque environnement (pertinent).

Comment puis-je faire ressortir la liste de chaînes d'environnements du monde in-PowerShell vers le monde PowerShell externe?

Répondre

1

Je lis votre question:

Lorsque awsAccount 1 est pertinent, donner les options pour awsAccount 1 (Dev, test, Demo) »

Lorsque awsAccount 2 est pertinent, donner options pour awsAccount 2 (Demo, Mise en scène, production) »

le principal changement est à votre ligne $envs = ([string](... J'ai utilisé une nouvelle variable $envsToDisplayInPrompt pour éviter toute confusion avec l'original $envs.

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) 

Sortie:

Prompt output

+0

C'est génial. Est-ce que le principal changement est que vous avez utilisé un type différent de variables? Je peux voir ça fonctionne, mais je ne vois pas comment. –

+0

J'ai changé la condition à $ _. AwsAccount - comme "*" + $ awsAccount + "*" pour que ça marche. –

+0

@RichardMoore Content d'ici que ça marche. Le changement principal est à la ligne '$ envs = ([chaîne] (..' car je ne suis pas convaincu que cela retourne correctement le tableau de chaînes requis par '$ options = ...'. Vous pouvez le tester en utilisant 'Write -Host $ env' _after_ cette ligne et voir ce qu'elle imprime.Utiliser le même nom de variable est normalement très bien, j'utilise différent pour la clarté. – gms0ulman