Функциональность разделения Powershell для блочных данных - PullRequest
0 голосов
/ 13 июля 2020

У меня есть вывод в PowerShell, как показано ниже:

Server Name: xx1
State: Running
Enabled: Enabled
Host Name: abc
PID: 1000
Description: HHH

Server Name: xx2
State: Running
Enabled: Enabled
Host Name: abc
PID: 10001
Description: HHH

Server Name: xx3
State: Running
Enabled: Enabled
Host Name: abc
PID: 10003
Description: HHH

Я хочу разделить вывод выше и сохранить каждый блок в переменной, например

$x = Server Name: xx1
State: Running
Enabled: Enabled
Host Name: abc
PID: 1000
Description: HHH

Как я могу это сделать, используя PowerShell?

Ответы [ 3 ]

0 голосов
/ 13 июля 2020

Если этот вывод представляет собой однострочную строку, вы можете разделить на пустые символы новой строки, чтобы получить массив текстовых блоков, которые вы можете использовать по их порядковому номеру.

# here, your output is faked by a using a Here-String
$output = @'
Server Name: xx1
State: Running
Enabled: Enabled
Host Name: abc
PID: 1000
Description: HHH

Server Name: xx2
State: Running
Enabled: Enabled
Host Name: abc
PID: 10001
Description: HHH

Server Name: xx3
State: Running
Enabled: Enabled
Host Name: abc
PID: 10003
Description: HHH
'@

$items = $output -split '(\r?\n){2,}'

В этом примере у вас будет массив из 3 элементов, которые вы можете использовать отдельно:

$x = $items[0]
$y = $items[1]
$z = $items[2]

или использовать al oop:

$items | ForEach-Object {
    # '$_' in here is a single element of the array
}
0 голосов
/ 13 июля 2020

Если команда PowerShell сгенерировала этот вывод, вы можете просто сохранить вывод (результаты стандартного вывода) в переменной. Каждый блок данных будет объектом с парой property:value. Итоговым результатом будет набор этих объектов. Вы можете получить доступ к каждому объекту, используя индексирование массива или условное логирование c.

# Array Indexing
$x = command
$x[0] # First object
$a = $x[0] # Storing first object in a variable

# Conditional Logic
$x = command
$a = $x | Where {$_.'Server Name' -eq 'xx1'}

# Using Select-Object
$x = command
$a = $x | Select-Object -First 1

Если вывод представляет собой одну строку, вам нужно будет выполнить некоторые операции со строкой. Вы можете разделить вывод на массив строк. Со строками, в отличие от нескалярных объектов, у вас не будет пар property:value и, следовательно, вы потеряете большую гибкость.

# $data is single string of your output
$x = $data -split '\r?\n\s*\r?\n' # split string
$a = $x[0] # Access first output block with index [0] and store in variable

# Store each server block in a variable: $a0, $a1, $a2, etc.
0..($x.Count-1) | Foreach-Object { 
    Set-Variable -Name a$_ -Value $x[$_]
}
$a0 # First server
$a1 # second server
$a2 # third server

Если ваш вывод представляет собой массив строк, вы можете l oop через массив и создайте свой собственный массив элементов сервера:

# Output is an array of strings
$x = command
$a = for ($i = 0; $i -lt $x.count; $i+=7) {
    ,$x[$i..($i+5)]
}
$a[0] # Your first array with xx1 data

# Store each server block in a variable: $b0, $b1, $b2, etc.
0..($a.Count-1) | Foreach-Object { 
    Set-Variable -Name b$_ -Value $a[$_]
}
$b0 # First server
$b1 # second server
$b2 # third server

Если вы собираетесь читать вывод из файла, вы можете выбрать чтение файла как массива строк или отдельного строка. Затем вы можете применить любой из вышеперечисленных методов в зависимости от того, что вы выберете:

# Single String Read
$x = Get-Content file.txt -Raw

# Array of Strings Read
$x = Get-Content file.txt
0 голосов
/ 13 июля 2020

Попробуйте следующее:

$output = ((The Command Here)  | Out-String) -split "\r\n"
$I = 0
@("Variable1","Variable2","Variable3") | Foreach {
  Set-Variable -Name "$_" -Value "$output[$I]"
  $I++
}

Вы также можете использовать массив:

$x = The command
$x[0] # first line
$x[1] #second line
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...