首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Write-Host删除Write-Output不支持的换行符

Write-Host删除Write-Output不支持的换行符
EN

Stack Overflow用户
提问于 2021-05-27 21:08:08
回答 1查看 73关注 0票数 0

命令$output = Invoke-Expression "cfn-lint *.yaml"为我提供了一个$output数组

代码语言:javascript
复制
$output.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

Write-Output $output给了我这个很好的输出:

代码语言:javascript
复制
Write-Output $output
W2506 Parameter AMIID should be of type [AWS::EC2::Image::Id, 
AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>]
trace3-ec2-virtual-machine-creation.yaml:27:3

W2001 Parameter VpcId not used.
trace3-ec2-virtual-machine-creation.yaml:32:3

但是Write-Host $output给了我一个去掉了所有换行符的版本:

代码语言:javascript
复制
Write-Host $output                                                                                                                                                                                                                
W2506 Parameter AMIID should be of type [AWS::EC2::Image::Id, AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>] trace3-ec2-virtual-machine-creation.yaml:27:3  W2001 Parameter VpcId not used. trace3-ec2-virtual-machine-creation.yaml:32:3

它为什么要这么做?

我知道我可以通过调用Write-Host ($output | Out-String)来解决这个问题,但我不明白为什么会这样。

EN

回答 1

Stack Overflow用户

发布于 2021-05-28 00:10:44

Write-Output使用[-InputObject] <PSObject[]>作为参数,而Write-Host使用[[-Object] <Object>]作为参数。

Write-Output返回作为输入提交的对象。Write-Host将对象发送到主机。它不返回任何对象。但是,主机显示Write-Host发送给它的对象。

如您所见,Write-Ouput接受PSObjectarray作为输入参数,并返回与输出相同的array

Out-StringWrite-Host中工作得很好,因为它将数组转换为multiline string,因此Write-Host会将其作为文字返回给信息流,而如果没有Out-String,它将获取数组中的所有行,并将它们连接到一个行字符串中。

代码语言:javascript
复制
PS /> $test = @(
    'this is a'
    'test'
)

$writeHost = Write-Host -Object $test 6>&1
$writeOutput = Write-Output -Object $test

$writeHost.GetType()
$writeOutput.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                       
-------- -------- ----                                     --------                                                                                                       
True     False    InformationRecord                        System.Object                                                                                                  
True     True     Object[]                                 System.Array

编辑

在你的评论之后,我不知道为什么,我在MS Docs上找不到cmdlet的任何相关信息,但我们可以假设它正在对输入对象进行某种操作。我们知道Write-HostWrite-Information的包装器。

以此函数为例,它接收一个[object],在本例中,它接收一个包含2个项目的array作为输入,并将其输入的string表示形式写入信息流:

代码语言:javascript
复制
$test = @(
    'this is a'
    'test'
)

function TestString ([object]$String) {
    Write-Information ([string]$String) -InformationAction Continue
}

PS /> TestString $test
this is a test
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67722832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档