Powershell循环,直到输出为一行

时间:2018-11-06 12:51:03

标签: azure powershell azure-cli azure-cli2

我要实现的是,如果输出是一行,并且该行被写到变量中。这是我现在拥有的代码:

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

此代码过滤一次,然后将所有行写在彼此下面,因此结果如下:

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

但首选输出是保持过滤直到剩下一个

1 个答案:

答案 0 :(得分:2)

Out-GridView

  

但首选输出是保持过滤直到剩下一个

根据正在运行的用户为过滤器选择的内容,这可能是一种惩罚方法/不必要地复杂。如果您只想得到一个结果,我们将使用Out-GridView之类的东西来允许用户从所选过滤器中选择一个结果。

$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

可以使用过-PassThru,但是可以进行多种选择。 -OutputMode Single。因此,如果$filter过于模糊,这仍然有可能做出巨大的选择集,但这是确保获得结果的一种简单方法。另一个警告是用户可以单击“取消”。因此,您可能仍需要一些循环逻辑:do{..}until{}。这取决于您要执行此过程的弹性。

选择

如果Out-GridView不是您的速度。另一种选择是使用$host.ui.PromptForChoice建立动态选择系统。下面是一个示例,允许用户从集合中选择一个子文件夹。

$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

您应该能够像我在Out-GridView中所建议的那样,将其适应代码。但是请谨慎使用此方法。太多的选项会使屏幕混乱。