有没有一种方法可以一次回显多个对象?

时间:2020-06-16 03:43:56

标签: powershell

我想确定我是否可以在Powershell中回显多个对象。我尝试搜索此内容并找到了this,但这不是我想要的。

基本上,我希望能够使用一个命令来回显两个不同的对象(在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 个答案:

答案 0 :(得分:1)

简而言之:You can only send one thing to the pipeline at a time.可以是字符串,字符串数组或任何其他对象。

您要的不是输出多个对象,而是基本上只是显示输出和格式化输出的方式。

PowerShell is object-based and not text-based。显示的输出不满足要求。它具有默认格式,以方便且易读的方式显示对象,甚至还有一些特殊格式,以熟悉的方式显示某些对象类型(例如文件系统项)。

如果我理解正确,则您正在尝试显示“彼此相邻”的多个对象。这是一种非常面向文本的方法(不是面向对象的)。我不推荐。

基本上,这只是一个格式问题。问自己:您期望输出看起来如何?然后,找到一种方法来做到这一点。其他答案中已经提到了一些简单的示例。您可能还想编写一个自定义formatting file

最后,这完全取决于您的个人喜好。问问自己,您真的需要吗?又为什么呢这可能是XY problem

答案 1 :(得分:0)

您可以使用-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),然后打印该字符串(包含在{{ 1}})和另一个“测试”。

这是如何使用一个命令(无循环)打印$_的另一个示例

get-service

答案 2 :(得分:0)

根据microsoft docs

ForEach-Object(%)cmdlet对对象中的每个项目执行操作 输入对象的集合。

另外,集合就是数组。因此,您确实需要将数组提供给foreach(%)cmdlet

其他一些例子:

@("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“ $ _ test”}

当我们检查(echo "test ntest“)。gettype()`是什么时,我们可以看到它是一个System.Object而不是一个数组。因此foreach对象会将其看作是一个内部有1个元素的数组。 / p>