VMware Cloud Community
eaphilipp
Contributor
Contributor
Jump to solution

Dynamic Menu Help

I am trying to build a script that populates a menu using a get command. I have everything working up until the part where when I make my menu selection, I need that menu item to be used in the next command. In this script I am getting VM tag names using:

Get-TagCategory -Name BackUps | Get-Tag | select name | Out-File C:\VMWare-TXTfiles\VeeamTags.txt -force

I then get the content of the file and populate the menu:

$v = get-content 'C:\VMWare-TXTfiles\VeeamTags.txt' | select-object -skip 3

$list = @($v)

# Create blank array to hold menu

$formattedList = @()

# Even Odd Columns

for($i=0;$i -lt $list.Count; $i+=2) {

    # Check if even exists

    if ($list[$i+1] -ne $null) {

        $formattedList += [PSCustomObject]@{

            Odd = "$($i+1). $($list[$i])";

            Even = "$($i+2). $($list[$i+1])"

        }

    }

    else {

        $formattedList += [PSCustomObject]@{

            Odd = "$($i+1). $($list[$i])";

            Even = ""

        }

    } 

}

# Output menu

$formattedList | Format-Table -HideTableHeaders

So the menu looks like this, it is 86 items in total but you get the point:

1. MGMT-0330          2. STRETCHWLD01-1000

3. CLU01-2330         4. STRETCHWLD01-1530

And I get prompted to choose a tag, When I choose one of the tags. I need it to populate the command: get-vm -tag ""

So if I choose 1 it would do the following: get-vm -tag MGMT-0330

I have this as my next line.

Switch ($input){

'1' {get-vm -tag <tag name from menu>}

I am guessing I need to some how change that 1 to a variable and whats inside the tag name from menu to something? Anyone ever done and thing like this? Thanks for the help...

0 Kudos
1 Solution

Accepted Solutions
LucD
Leadership
Leadership
Jump to solution

I'm not sure why write/read via that file?
And I don't think you need a switch-block.
Try something like this

$v = Get-TagCategory -Name Backups | Get-Tag

$menu = for ($i = 0; $i -lt $v.Count; $i += 2)

{

   $obj = [ordered]@{

   Odd = "$($i+1). $($v[$i].Name)"

   }

   if ($v[$i + 1])

   {

   $obj.Add('Even', "$($i+2). $($v[$i+1].Name)")

   }

   New-Object PSObject -Property $obj

}

$menu | Format-Table -HideTableHeaders

$choice = Read-Host -Prompt "Select tag (1..$($v.Count))"


Get-VM -Tag $v[$choice - 1].Name


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

View solution in original post

0 Kudos
2 Replies
LucD
Leadership
Leadership
Jump to solution

I'm not sure why write/read via that file?
And I don't think you need a switch-block.
Try something like this

$v = Get-TagCategory -Name Backups | Get-Tag

$menu = for ($i = 0; $i -lt $v.Count; $i += 2)

{

   $obj = [ordered]@{

   Odd = "$($i+1). $($v[$i].Name)"

   }

   if ($v[$i + 1])

   {

   $obj.Add('Even', "$($i+2). $($v[$i+1].Name)")

   }

   New-Object PSObject -Property $obj

}

$menu | Format-Table -HideTableHeaders

$choice = Read-Host -Prompt "Select tag (1..$($v.Count))"


Get-VM -Tag $v[$choice - 1].Name


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

0 Kudos
eaphilipp
Contributor
Contributor
Jump to solution

AWESOME! Yes thank you this works great. I tried to do it my way because I wasn't sure of the right way! Thanks very much for the help.

0 Kudos