Формат таблицы от вывода строки - PullRequest
0 голосов
/ 04 июля 2018

Я пробовал разные способы, но не смог отформатировать данные в таблицу

$str1 = "First string"
$str2 = "Sec string"
$str3 = "third str"
$str4 = "fourth string"

$str = "$str1 $str2 `r`n"
$str+= "$str3 $str4"

write-host $str | Format-Table

Я хочу создать вывод, как показано ниже:

First string  Sec string 
third str     fourth string

1 Ответ

0 голосов
/ 04 июля 2018

Чтобы использовать Format-Table по назначению, вам нужно объекты со свойствами вместо простых строк:

$str -split "`r`n" | ForEach-Object {
    # Initialize a custom object whose properties will reflect 
    # the input line's tokens (column values).
    $obj = New-Object PSCustomObject; $i = 0
    # Add each whitespace-separated token as a property.
    foreach ($token in -split $_) {
      Add-Member -InputObject $obj -NotePropertyName ('col' + ++$i) -NotePropertyValue $token
    }
    # Output the custom object.
    $obj
  } | Format-Table -HideTableHeaders
  • $str -split "`r`n" разбивает многострочную строку на отдельные строки и отправляет их по конвейеру по очереди.

  • Команда ForEach-Object создает пользовательский объект из каждой строки, свойства которого являются разделенными пробелами токенами в строке, как описано в комментариях; имена свойств, которые не имеют значения для вывода, автоматически генерируются как col1, col2, ...

    • Примечание : Это не точно соответствует вашему желаемому результату в том смысле, что каждый пробел (пробел) пропускается как сепаратор . Если вы хотите обработать исходные значения переменных $str1, $str2, ... (например, First string), каждое как значение столбца single , вам нужно сделать предположения о том, как токенизировать строку.
      Например, , если предполагается, что 2 последовательных слова образуют одно значение , замените -split $_ выше на $_ -split '(\w+ \w+) ?' -ne ''

    • Если вы не хотите полагаться на предположения , вам придется создать входные строки с встроенным цитированием , чтобы однозначно указать границы токена (для корректного анализа встроенного цитирования пришлось бы изменить код).

  • Format-Table затем отображает пользовательские объекты в табличной форме с правильно выровненными столбцами; -HideTableHeaders подавляет строку заголовка (автоматически генерируемые имена свойств).

С вашим примером ввода приведенное выше дает следующее: без -HideTableHeaders, чтобы лучше проиллюстрировать, что делает код:

col1  col2   col3   col4
----  ----   ----   ----
First string Sec    string
third str    fourth string

То же самое, но с логикой разделения двух последовательных слов:

col1         col2
----         ----
First string Sec string
third str    fourth string

Что касается того, что вы пытались:

  • Не использовать Write-Host для получения данных вывод: Write-Host вывод (по умолчанию) идет на консоль и обходит конвейер , так что Format-Table не получает никакого ввода и здесь не имеет никакого эффекта.

  • Тем не менее, даже если Format-Table действительно получил вход (используя сам $str, без Write-Host, то есть: $str | Format-Table), он не будет иметь (видимого) эффекта для строк , которые всегда отображаются как есть .

...