2012-05-31 96 views
87

我对打印(回显)到控制台的各种方法有点混淆。我已经看到,有多种方法将输出写入到控制台,如:在PowerShell中写入控制台的最佳方式

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的别名,或者意图是什么?

+2

[写入主机是邪恶](http://windowsitpro.com/blog/what-do-not-do-powershell-part-1) –

回答

64

PowerShell的默认行为只是将所有掉出管道但不被另一个管道元素拾取或分配给变量(或重定向到Out-Host)的所有内容。 Out-Host所做的显然是与主机相关的。

只是让东西掉下来的管道是Write-Host的替代品,其存在于宿主应用程序输出文本的唯一原因。

如果要输出,请使用Write-* cmdlet。如果您想从函数返回值,则只需在没有任何cmdlet的情况下将对象转储到那里。

+0

为什么写主机“你好世界”抛出错误“预期结束语句”? – FrenkyB

+0

我不知道。在PowerShell中键入它在这里显示预期的行为,并且不会出现错误。 – Joey

+1

我已经在.vbs脚本中输入了。只是这一行代码,它是抛出我的错误。 – FrenkyB

35

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

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

"hello world" | Do-Something 

但是这不会工作,因为Write-Host写入控制台,而不是管道(DO-东西不会得到的字符串):

Write-Host "hello world" | Do-Something 
+3

这个答案在技术上是正确的,但我怀疑它会导致新手PowerShell用户误入歧途。有效的PowerShell的第一条规则是生成在管道中很有用的输出。如果你非常使用写主机,你可能会做错了。 – OldFart

+3

那么,这不是OP问的问题,如何写入控制台?写入主机和写入管道是有区别的,并且必须知道每个人做了什么。我会通过澄清更新我的答案。 –