Powershell loop until the output is one line

146 Views Asked by At

What i am trying to achieve is that if the output is one line and that that line gets written away in a variable. This is the code i have right now:

Connect-AzureRmAccount
(get-azurermresourcegroup).ResourceGroupName 
$filter = Read-Host -Prompt "Please filter to find the correct resource group" 
$RGName = get-azurermresourcegroup | Where-Object { $_.ResourceGroupName -match $filter } 
$RGName.resourcegroupname

this code filters one time and after that it writes all the lines away underneath each other so the results are this:

ResourceGroup-Test
ResourceGroup-Test-1
ResourceGroup-Test-2 

but the preferred output is to keep filtering until one is left

1

There are 1 best solutions below

7
On BEST ANSWER

Out-GridView

but the preferred output is to keep filtering until one is left

Depending on what the running user chooses for filters this could be a punishing approach / needlessly complicated. If you only want one result how about we instead use something like Out-GridView to allow the user to select one result from their chosen filter.

$filter = Read-Host -Prompt "Please filter to find the correct resource group" 
$RGName = get-azurermresourcegroup | 
    Where-Object { $_.ResourceGroupName -match $filter } | 
    Out-GridView -OutputMode Single 
$RGName.resourcegroupname

You could have used -PassThru but that allows for multiple selections. -OutputMode Single. So this would still have the potential for making a huge selection set if $filter was too vague but this is a simple way to ensure you get one result. Another caveat is that the user could click Cancel. So you might still need some loop logic: do{..}until{}. That depends on how resilient you want to make this process.

Choice

If Out-GridView is not your speed. Another option would be to make a dynamic choice system using $host.ui.PromptForChoice. The following is an example that allows users to choose a subfolder from a collection.

$possibilities = Get-ChildItem C:\temp -Directory

If($possibilities.Count -gt 1){
    $title = "Folder Selection"
    $message = "Which folder would you like to use?"

    # Build the choices menu
    $choices = @()
    For($index = 0; $index -lt $possibilities.Count; $index++){
        $choices += New-Object System.Management.Automation.Host.ChoiceDescription  ($possibilities[$index]).Name
    }

    $options = [System.Management.Automation.Host.ChoiceDescription[]]$choices
    $result = $host.ui.PromptForChoice($title, $message, $options, 0) 

    $selection = $possibilities[$result]
}

$selection

You should be able to adapt that into your code much in the same way that I suggested with Out-GridView. Be careful though about this approach. Too many options will clutter the screen.