Есть ли способ отображать сразу несколько объектов? - PullRequest
1 голос
/ 16 июня 2020

Я хочу узнать, могу ли я отобразить несколько объектов в PowerShell. Я попытался найти это и нашел это , но это было не то, что я искал.

По сути, я хочу иметь возможность отображать два разных объекта (которые можно увидеть в foreach-object) одной командой.

Ожидаемые ввод и вывод

PS C:\> <echo multiple object command> "test" | % {echo "$_ test"}
test test
test test

Ввод и вывод для того, что я пробовал.

PS C:\> echo "test`ntest" | % {echo "$_ test"}
test
test test 

Ожидаемый результат:

test test
test test

Если я сделаю это с get-process, например, вот так:

PS C:\> get-process | % {echo "$_ and this"}

Результат:

Process1 (Thing) and this
Process2 (Thing) and this
Process3 (Thing) and this
Process4 (Thing) and this

Это также будет работать с такими массивами:

PS C:\> $test = @("test1","test2","test3")
PS C:\> $test | % {echo "$_ and this"}
test1 and this
test2 and this
test3 and this

Но пока я не нашел способа воспроизвести это с указанием определенных объектов, кроме массивов

Резюме : Есть ли способ записать вывод нескольких объектов в PowerShell 5.1?

Итак, в общем, я хочу повторить вывод нескольких объектов?

Ответы [ 3 ]

1 голос
/ 16 июня 2020

Вкратце: Вы можете отправить в конвейер только одну вещь. Будь то строка, массив строк или любой другой объект.

То, что вы просите, - это не выводить несколько объектов, а в основном способ отображения и форматирования вывода.

PowerShell является объектно-ориентированным, а не текстовым . Отображаемый результат не является содержимым. Он имеет форматы по умолчанию для отображения объектов в удобном и читаемом виде, даже некоторые специальные форматы для отображения определенных типов объектов знакомым образом (например, элементы файловой системы).

Если я правильно понимаю, вы пытаетесь отобразить несколько объектов «рядом друг с другом». Это очень текстовый подход (не объектно-ориентированный). Не рекомендую.

По сути, это просто вопрос форматирования. Спросите себя: как вы ожидаете, что результат будет выглядеть? Затем найдите способ сделать это. Некоторые простые примеры уже упоминались в других ответах. Вы также можете написать собственный файл форматирования .

В конце концов, все зависит от ваших личных предпочтений. Спросите себя, действительно ли оно вам нужно? И почему? Это может быть проблема XY .

0 голосов
/ 16 июня 2020

Согласно microsoft docs

Командлет ForEach-Object (%) выполняет операцию над каждым элементом в коллекции входных объектов.

И другими словами, коллекция - это массив Так что вам действительно нужно передать массив в командлет foreach (%)

Некоторые другие примеры:

@("test1","test2","test3").gettype() # system.array

(get-process).gettype() # system.array

(1..10).gettype() # system.array
1..10 | % {echo "$_ test"}

"test`ntest".Split("`n").gettype() #system array
"test`ntest".Split("`n") | % {echo "$_ test"}

в вашем первом примере: echo "тест`нтест" | % {echo "$ _ test"}

когда мы проверяем, что такое (echo "test ntest "). gettype ()`, мы можем видеть его System.Object, а не массив. поэтому объект foreach увидит это как массив с 1 элементом внутри.

0 голосов
/ 16 июня 2020

Вы можете объединить вывод в одну строку с помощью метода -join.

($test | % {echo "$_ and this"}) -join ","
# test1 and this,test2 and this,test3 and this

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

Write-Output "$test"
# test1 test2 test3

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

echo "test`ntest" | % {echo "$_ test"}
test
test test

В основном вы соединяете строку ( test'ntest) объекту foreach, который выполняет итерацию только один раз , потому что есть только одна строка (test'ntest), а затем распечатайте ее (содержащуюся в $_) с другим «тестом».

Вот еще один пример того, как вы можете напечатать get-service с помощью одной команды (без цикла)

Write-output (get-service)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...