Как создать объект из форматированного текста в powershell - PullRequest
0 голосов
/ 19 марта 2020

У меня есть вывод команды IBM Tivoli, который на самом деле представляет собой набор ключей и значений, он выглядит так:

Name                   : NT_Paging_File_Warning
Full Name              : 
Description            : Knt:KNT1340
Type                   : Windows OS
Formula                : *IF *VALUE NT_Paging_File.%_Usage *GE 75 *AND *VALUE NT_Paging_File.%_Usage *LT 0 *AND *VALUE NT_Paging_File.Pagefile_Name_U *NE _Total
Sampling Interval      : 0/0:15:0
Run At Start Up        : Yes
Distribution           : 
Text                   : ADVICE("knt:"+$ISITSTSH.SITNAME$);
Action Location        : Agent
Action Selection       : System Command
System Command         : *NONE
True For Multiple Items: Action on First Item only
TEC Severity           : Warning
TEC Forwarding         :  
TEC Destination        :  

Я хочу эффективно взять этот вывод и преобразовать его в объект powershell с очевидные атрибуты и ценности. Как видите, некоторые значения могут быть пустыми, а некоторые атрибуты имеют пробелы в именах. : - это стандартное разделение между ключом и значением.

Какой хороший способ PowerShell go по этому поводу?

Причина, по которой я хочу это сделать, - отправить эти записи в виде объектов вниз по трубе, где я буду использовать такие вещи, как Where-Object, чтобы отфильтровать те, которые я хочу, et c, et c

1 Ответ

3 голосов
/ 19 марта 2020
  1. Используйте оператор -split, чтобы разделить на (первое) :
  2. Обрезать результирующие строки и использовать их для заполнения словаря [ordered]
  3. Cast словарь для [pscustomobject]
$tivoliOutput = @'
Name                   : NT_Paging_File_Warning
Full Name              : 
Description            : Knt:KNT1340
Type                   : Windows OS
Formula                : *IF *VALUE NT_Paging_File.%_Usage *GE 75 *AND *VALUE NT_Paging_File.%_Usage *LT 0 *AND *VALUE NT_Paging_File.Pagefile_Name_U *NE _Total
Sampling Interval      : 0/0:15:0
Run At Start Up        : Yes
Distribution           : 
Text                   : ADVICE("knt:"+$ISITSTSH.SITNAME$);
Action Location        : Agent
Action Selection       : System Command
System Command         : *NONE
True For Multiple Items: Action on First Item only
TEC Severity           : Warning
TEC Forwarding         :  
TEC Destination        :  
'@ -split '\r?\n'

# Prepare dictionary to hold properties
$properties = [ordered]@{}

foreach($line in $tivoliOutput){
    # Split line into key and value
    $key,$value = $line -split ':',2 |ForEach-Object Trim

    # Remove spaces from the key names, comment out this line to retain names as-is
    $key = $key -replace '\s'

    # Add to our dictionary of properties
    $properties[$key] = $value
}

# create object
[pscustomobject]$properties
...