命令$output = Invoke-Expression "cfn-lint *.yaml"为我提供了一个$output数组
$output.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.ArrayWrite-Output $output给了我这个很好的输出:
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给了我一个去掉了所有换行符的版本:
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)来解决这个问题,但我不明白为什么会这样。
发布于 2021-05-28 00:10:44
Write-Output使用[-InputObject] <PSObject[]>作为参数,而Write-Host使用[[-Object] <Object>]作为参数。
Write-Output返回作为输入提交的对象。Write-Host将对象发送到主机。它不返回任何对象。但是,主机显示Write-Host发送给它的对象。
如您所见,Write-Ouput接受PSObject的array作为输入参数,并返回与输出相同的array。
Out-String在Write-Host中工作得很好,因为它将数组转换为multiline string,因此Write-Host会将其作为文字返回给信息流,而如果没有Out-String,它将获取数组中的所有行,并将它们连接到一个行字符串中。
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-Host是Write-Information的包装器。
以此函数为例,它接收一个[object],在本例中,它接收一个包含2个项目的array作为输入,并将其输入的string表示形式写入信息流:
$test = @(
'this is a'
'test'
)
function TestString ([object]$String) {
Write-Information ([string]$String) -InformationAction Continue
}
PS /> TestString $test
this is a testhttps://stackoverflow.com/questions/67722832
复制相似问题