Чтобы использовать 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
), он не будет иметь (видимого) эффекта для строк , которые всегда отображаются как есть .