为了账号安全,请及时绑定邮箱和手机立即绑定

“写主机”,“写输出”或“ [控制台] :: WriteLine”之间有什么区别?

“写主机”,“写输出”或“ [控制台] :: WriteLine”之间有什么区别?

繁华开满天机 2019-11-11 13:02:01
有多种不同的输出消息的方式。是通过什么东西输出之间的有效差异Write-Host,Write-Output或[console]::WriteLine?我还注意到,如果我使用:write-host "count=" + $count将+被包括在输出。为什么?在写出表达式之前,不应该对表达式求值以生成单个串联的字符串吗?
查看完整描述

3 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

Write-Output当您想在管道上发送数据,但不一定要在屏幕上显示数据时,应使用。out-default如果没有其他人首先使用它,则管道最终会将其写入。


Write-Host 当您想做相反的事情时应该使用。


[console]::WriteLine本质上Write-Host是幕后工作。


运行此演示代码并检查结果。


function Test-Output {

    Write-Output "Hello World"

}


function Test-Output2 {

    Write-Host "Hello World" -foreground Green

}


function Receive-Output {

    process { Write-Host $_ -foreground Yellow }

}


#Output piped to another function, not displayed in first.

Test-Output | Receive-Output


#Output not piped to 2nd function, only displayed in first.

Test-Output2 | Receive-Output 


#Pipeline sends to Out-Default at the end.

Test-Output 

您需要将连接操作括在括号中,以便PowerShell在对的参数列表进行标记化之前处理该连接Write-Host,或者使用字符串插值


write-host ("count=" + $count)

# or

write-host "count=$count"

顺便说一句-观看Jeffrey Snover的这段视频,解释管道的工作原理。回到我开始学习PowerShell时,我发现这是关于管道如何工作的最有用的解释。


查看完整回答
反对 回复 2019-11-11
?
冉冉说

TA贡献1877条经验 获得超1个赞

除了Andy提到的内容外,还有另一个可能很重要的区别-写主机直接写到主机,什么也不返回,这意味着您不能将输出重定向到例如文件。


---- script a.ps1 ----

write-host "hello"

现在在PowerShell中运行:


PS> .\a.ps1 > someFile.txt

hello

PS> type someFile.txt

PS>

如图所示,您无法将它们重定向到文件中。对于一个不小心的人来说,这也许令人惊讶。


但是,如果改用写输出代替,您将获得预期的重定向工作。


查看完整回答
反对 回复 2019-11-11
?
四季花海

TA贡献1811条经验 获得超5个赞

这是完成Write-Output等效的另一种方法。只需将您的字符串用引号引起来:


"count=$count"

您可以通过运行以下实验来确保其与Write-Output相同:


"blah blah" > out.txt


Write-Output "blah blah" > out.txt


Write-Host "blah blah" > out.txt

前两个将输出“等等”到out.txt,但第三个不会。


“帮助Write-Output”给出了这种行为的提示:


此cmdlet通常在脚本中使用,以在控制台上显示字符串和其他对象。但是,由于默认行为是在管道的末尾显示对象,因此通常不必使用cmdlet。


在这种情况下,字符串本身“ count = $ count”是管道末端的对象,并显示出来。


查看完整回答
反对 回复 2019-11-11
  • 3 回答
  • 0 关注
  • 576 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信