如何在 PowerShell 中写入控制台?

对于打印(echo)到控制台的各种方法,我有些困惑。我发现有多种方法可以将输出写入控制台,例如:

Write-Host "Hello world1"
"Hello World2"
Out-Host -InputObject "Hello World3"

这三种方式都将打印到控制台。中间那个更简单,不那么冗长,也更容易使用。我还发现,当您编写如下函数时:

function GetValues()
{
"1"
"2"
}

它仍然返回管道中的两个字符串:

我仍然可以打印出数值:

foreach ($s in GetValues)
{
Write-Host "s: " $s
}

我发现只使用引号字符串并不总是出现在自定义主机上,而且我必须使用 写主机来获取在自定义主机上打印的值。

不知怎么的,我觉得这很令人困惑。 "Print something"应该是 Write-Host的别名吗? 或者它的意图是什么?

382669 次浏览

PowerShell 的默认行为只是转储掉出管道的所有内容,而不会被另一个管道元素拾取,也不会被分配给变量(或重定向)到 Out-Host中。Out-Host所做的显然是依赖于宿主的。

没有Write-Host的替代品,Write-Host存在的唯一原因是在主机应用程序中输出文本。

如果想要输出,那么使用 Write-* cmdlet。如果希望从函数返回值,那么只需将对象转储到那里,而不使用任何 cmdlet。

中间的那个写入管道。Write-HostOut-Host写入控制台。’echo’是 Write-Output的别名,它也写入管道。写入控制台的最佳方式是使用 Write-Hostcmdlet。

当一个对象被写入管道时,它可以被链中的其他命令使用,例如:

"hello world" | Do-Something

但是这不会起作用,因为 Write-Host写到控制台,而不是管道(Do-Something 不会得到字符串) :

Write-Host "hello world" | Do-Something