2016-10-26 92 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