Функция Powershell, пока l oop не выводит результат в первый раз, а выводит второй раз, дважды - PullRequest
0 голосов
/ 13 января 2020

Как вы видите, у меня есть 5 вариантов для выбора после запуска скрипта. Когда я нажимаю 1, опция 1, выбранная ", печатается, но функция get_all_tags не вызывается и не печатает список тегов. Второй раз вокруг нее выводятся результаты из функция повторяет результат дважды.

Странно то, что он несовместим. Я запускаю скрипт и при первой попытке нажать 1, иногда получаю результат из функции get_all_tags . Когда все функции тестируются сами по себе, все работает отлично. Хотя l oop, кажется, вызвал что-то нерегулярное внутри и не уверен, как я могу это исправить.

$options=0
$iteration=0

while($options -ne 5)
{

$options = read-host -prompt "
Press
 1. to search for all the tags running on Azure Virtual Machine(s)
 2. to search for resource using tag name
 3. to search for specific resource
 4. to search for value of a tag name
 5. to exit
"
if ($options -eq 1){

    write-host "option 1 selected"
    get_all_tags
     #give option to exit or go back to the main menu
     $iteration++
     $iteration

}

elseif ($options -eq 2){

    get_resource_with_tag_name $inputTagName
    #give option to exit or go back to the main menu

}

elseif ($options -eq 3){

    get_resource_tags $inputResource
    #give option to exit or go back to the main menu

}

elseif ($options -eq 4){

    get_keys_value $inputTagKey
    #give option to exit or go back to the main menu

} 
}


Function get_resource_tags($resourceName)
{
    $inputResource = read-host -prompt 'Write a resource name you wish to search with all associated tags'
    return (get-azresource -ResourceGroupName $inputResource).Tags


}

Function get_resource_with_tag_name($tagName){
    $inputTagName = read-host -prompt 'Write a tag name you wish to search associated with resource'

    return (get-AzResource -TagName $inputTagName).Name 

}


Function get_all_tags{


  return get-aztag

}


Function get_keys_value($tagKeyName){
   $inputTagKey = read-host -prompt 'Write a tag name'

   $result = (get-aztag -Detailed $inputTagKey).Values 
   $final = $result | ft  -property @{n="Tag Value";e={$_.name}},count

   return $final
}

Ответы [ 2 ]

3 голосов
/ 13 января 2020

PowerShell - это язык интерпретатора, а не язык компилятора. Следовательно, расположение ваших функций портится с вашими результатами. Они должны быть объявлены до вызова.

В вашем случае, во время 1-го запуска, пока l oop не знает о функциях, определенных ниже. Как только вы запустите его полностью, функции будут загружены в память, и, следовательно, второй запуск, вероятно, даст вам ожидаемые результаты.

0 голосов
/ 14 января 2020

спасибо @sid за ответ и за указанную разницу. Несмотря на внесение изменений, параметры 1 и 3 продолжают работать так же, а 2 и 4 всегда выводят результаты.

Function get_all_tags{


  return get-aztag

}

Function get_resource_with_tag_name($tagName){
    $inputTagName = read-host -prompt 'Write a tag name you wish to search associated with resource'

    return (get-AzResource -TagName $inputTagName).Name 

}

Function get_resource_tags($resourceName)
{
    $inputResource = read-host -prompt 'Write a resource name you wish to search with all associated tags'
       $iteration++
     $iteration
    return (get-azresource -ResourceGroupName $inputResource).Tags


}

Function get_keys_value($tagKeyName){
   $inputTagKey = read-host -prompt 'Write a tag name'

   $result = (get-aztag -Detailed $inputTagKey).Values 
   $final = $result | ft  -property @{n="Tag Value";e={$_.name}},count

   return $final
}



$options=0
$iteration=0

while($options -ne 5)
{

$options = read-host -prompt "
Press
 1. to search for all the tags running on Azure Virtual Machine(s)
 2. to search for resource using tag name
 3. to search for specific resource
 4. to search for value of a tag name
 5. to exit
"
if ($options -eq 1){

    write-host "option 1 selected"
    get_all_tags
     #give option to exit or go back to the main menu


}

elseif ($options -eq 2){

    get_resource_with_tag_name $inputTagName
    #give option to exit or go back to the main menu

}

elseif ($options -eq 3){
    write-host "hello"

    get_resource_tags $inputResource
    #give option to exit or go back to the main menu

}

elseif ($options -eq 4){

    get_keys_value $inputTagKey
    #give option to exit or go back to the main menu

} 
}
...