在PowerShell中写入控制台的最佳方法


142

我对在控制台上进行打印(回显)的各种方式有些困惑。我已经看到有多种方法可以将输出写入控制台,例如:

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

这三种方式都将打印到控制台。中间的代码在某种程度上更简单,更少冗长且易于使用。我还发现当您编写如下函数时:

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

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

而且我仍然可以打印出这些值:

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

我发现的是,仅使用加引号的字符串并不总是出现在自定义主机上,而且我不得不使用Write-Host来获取要在自定义主机上打印的值。

我不知何故感到困惑。被"Print something"认为是一个别名Write-Host或有什么意图?

Answers:


101

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

仅仅让事情脱离管道并不能代替它,Write-Host这是在主机应用程序中输出文本的唯一原因。

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


1
我已经在.vbs脚本中输入了它。只是那行代码,这使我出错。
FrenkyB 2014年

58

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

将对象写入管道时,链中的其他命令可以使用该对象。例如:

"hello world" | Do-Something

但这将无法正常工作,因为它Write-Host写入控制台,而不是写入管道(Do-Something无法获取字符串):

Write-Host "hello world" | Do-Something

3
这个答案在技术上是正确的,但是我怀疑它会使新手PowerShell用户误入歧途。有效的PowerShell的第一条规则是产生在管道中有用的输出。如果您经常使用Write-Host,则可能做错了。
OldFart

6
好吧,这不是OP要求的,如何写到控制台吗?写入主机和写入管道之间是有区别的,而且必须知道它们各自在做什么。我将澄清我的答案。
谢伊·利维
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.