2016-10-26 60 views
1

我正在学习PowerShell和我强烈阅读的大量文章不鼓励使用写主机告诉我这是“坏习惯”,几乎总是输出可以显示在其他方式。PowerShell:写输出只写一个对象

因此,我正在采取建议,并尽量避免使用写主机。我发现的一个建议是使用写输出。据我所知,这将所有内容放在一个管道中,输出在脚本的末尾执行(?)。

但是,我有问题输出我想要的。这一实例说明问题:

$properties = @{'OSBuild'="910ef01.2.8779"; 
       'OSVersion'="CustomOS 3"; 
       'BIOSSerial'="A5FT-XT2H-5A4B-X9NM"} 
$object = New-Object –TypeName PSObject –Prop $properties 
Write-output $object 

$properties = @{'Site'="SQL site"; 
       'Server'="SQL Server"; 
       'Database'="SQL Database"} 
$object = New-Object –TypeName PSObject –Prop $properties 
Write-Output $object 

这样,我得到了显示数据的操作系统的第一个对象的一个​​不错的输出,但包含SQL数据的第二对象从不显示。我尝试重命名变量名称和其他一些不同的东西,但没有运气。

在对此问题进行故障诊断时,我发现类似的问题,建议使用写主机替换写入输出。这让我非常困惑。为什么有些人强烈地沮丧写作主持人,而其他人鼓励呢?

我如何以一种时尚的方式输出这两个对象?我不完全了解写输出的管道机制。

+0

我试过这个在Powershell v4上,它们都以相同的方式输出,作为3列表。 – Sean

+0

@sean行,感谢您的信息。我使用的是PowerShell v5,它不适合我。很烦人。 – Scopperloit

+2

'。\ ScriptName.ps1 |格式列表' – PetSerAl

回答

2

一般来说期望是脚本/函数返回对象的单个“型”,往往有许多实例。例如,Get-Process会返回一个进程负载,但它们都具有相同的字段。正如您从教程中看到的那样,您可以沿管道传递Get-Process的输出,并使用后续cmdlet处理数据。

在你的情况下,你正在返回两种不同类型的对象(即有两套不同的属性)。 PS会输出第一个对象,但不会发现第二个对象(与第一个对象不匹配)。如果您要为第一个对象添加额外的属性以匹配第二个对象中使用的属性,那么您会看到两个对象。

Write-Host不关心这种东西。反对使用它的主要原因是(1)它是一种懒惰的方式来提供关于脚本进度的反馈,即使用Write-VerboseWrite-Debug来代替;(2)当涉及到沿管道传递对象时,它是不完美的,等等。

如果您的脚本确实是打算将数据打印到控制台,请继续并Write-Host

或者,您可以可以从脚本或函数返回多个对象。使用returnWrite-Output,只需以逗号分隔的方式返回对象对象。例如:

Test-WriteOutput。PS1

$object1 = [PSCustomObject]@{ 
    OSBuild = "910ef01.2.8779" 
    OSVersion = "CustomOS 3" 
    BIOSSerial = "A5FT-XT2H-5A4B-X9NM" 
} 

$object2 = [PSCustomObject]@{ 
    Site = "SQL site" 
    Server= "SQL Server" 
    Database="SQL Database" 
} 

Write-Output $object1,$object2 

的运行脚本,分配到输出两个变量:

$a,$b = .\Test-WriteOutput.ps1 

你会看到$一个$ object1$ B$ object2

+1

谢谢,这是澄清了很多。基本和精确的细节,我发现许多教程缺乏。 – Scopperloit

0

使用写入主机,写输出管道(并通过控制台默认清楚后)

+0

好的,想知道为什么很多人会劝阻这个吗?因为这主要是我在网上找到的:“绝不使用写主机”。 – Scopperloit

+1

我不明白为什么...总有人告诉你不要被纯粹主义语言元素使用。为您做出您的选择:) – Esperento57