Как получить конкретное значение ключа внутри коллекции с помощью powershell

#powershell #azure-powershell

Вопрос:

Приведенная ниже команда выдает вывод в виде объекта

$вывод = (Вызов-AzVMRunCommand -имя_группы ресурсов $имя пользователя-Имя $имя виртуальной машины-Идентификатор команды ‘RunPowerShellScript’ -Путь к созданию скрипта.ps1).значение

  Output
 

 Mode             : Process
ContextDirectory : 
ContextFile      : 
CacheDirectory   : 
CacheFile        : 
Settings         : {}

Code          : ComponentStatus/StdOut/succeeded
Level         : Info
DisplayStatus : Provisioning succeeded
Message       : @{cluster_name=test01; status=green; timed_out=False; number_of_nodes=3; 
              number_of_data_nodes=3; 
              active_primary_shards=25; active_shards=50; relocating_shards=0; 
              initializing_shards=0; 
              unassigned_shards=0; delayed_unassigned_shards=0; number_of_pending_tasks=0; 
              number_of_in_flight_fetch=0; task_max_waiting_in_queue_millis=0; 
              active_shards_percent_as_number=100.0}
 Time          : 
 Code          : ComponentStatus/StdErr/succeeded
 Level         : Info
 DisplayStatus : Provisioning succeeded
 

Как получить сообщение ==> number_of_nodes = 3 и number_of_data_nodes=3 в некоторой переменной, поэтому на основе этого значения мне нужно выполнить какое-то действие.
Спасибо

Комментарии:

1. Что же $output.Message.GetType() раскрывается?

2. $output.Message.number_of_nodes Должен дать вам то, что вам нужно

3. @TristanOtterpohl Его не работает, работает только вывод$. Сообщение и предоставление конкретных данных, но внутри сообщения есть значение пары нескольких ключей

4. $Выход = gc E:Result.txt foreach($temp в $выводе) { если($temp -соответствует «узлу») { [int]$number_of_nodes=(($temp -разделение»;») [3]-разделение «=»)[1] [int]$number_of_data_nodes=(($temp -разделение «;»)[4]-разделение «=»)[1] } } $number_of_nodes $number_of_date_nodes «‘ Этот код работает, когда я копирую этот вывод в какой-либо текстовый файл. но когда я напрямую работаю с выводом$, это не работает

5. @Theo , IsPublic = True , IsSerial = True , Имя = Строка и базовый тип = Система. Объект

Ответ №1:

Хорошо, если, как вы проверяли $Output.Message , это многострочная строка, такая как

 @{cluster_name=test01; status=green; timed_out=False; number_of_nodes=3; 
              number_of_data_nodes=3; 
              active_primary_shards=25; active_shards=50; relocating_shards=0; 
              initializing_shards=0; 
              unassigned_shards=0; delayed_unassigned_shards=0; number_of_pending_tasks=0; 
              number_of_in_flight_fetch=0; task_max_waiting_in_queue_millis=0; 
              active_shards_percent_as_number=100.0}
 

вы можете преобразовать это в хэш-таблицу, подобную этой:

 $data = $Output.Message.Trim("@{}") -replace ';', [environment]::NewLine | ConvertFrom-StringData
 

Если вы распечатаете это на экране, $data | Format-Table -AutoSize это будет выглядеть так:

 Name                             Value 
----                             ----- 
number_of_nodes                  3     
task_max_waiting_in_queue_millis 0     
number_of_data_nodes             3     
status                           green 
initializing_shards              0     
active_shards_percent_as_number  100.0 
cluster_name                     test01
delayed_unassigned_shards        0     
active_shards                    50    
unassigned_shards                0     
active_primary_shards            25    
number_of_in_flight_fetch        0     
timed_out                        False 
relocating_shards                0     
number_of_pending_tasks          0 
 

С помощью этого формата хэш-таблицы легко получить значения различных ключей.
Например:

 $data.number_of_nodes            # --> 3
$data.number_of_data_nodes       # --> 3
$data.cluster_name               # --> test01