ความแตกต่างของ PowerShell ระหว่าง Write-Host และ Write-Output?


คำตอบ:


82

สรุปWrite-Hostเขียนลงในคอนโซลเอง คิดว่ามันเป็น MsgBox ในVBScript Write-Outputในทางกลับกันเขียนไปยังไปป์ไลน์ดังนั้นคำสั่งถัดไปสามารถยอมรับเป็นอินพุตได้ คุณไม่จำเป็นต้องใช้Write-Outputเพื่อเขียนวัตถุตามที่Write-Outputเรียกโดยปริยายสำหรับคุณ

PS> Get-Service

จะเหมือนกับ:

PS> Get-Service | Write-Output

16
Powershell สับสนมากในลักษณะนี้ ควรอ่านลิงค์นี้เพื่อรับความรู้สึกของ pipline ที่กล่าวถึงใน powershell และวิธีการคืนค่าจากฟังก์ชัน "คีย์เวิร์ดส่งคืนใน PowerShell ทำให้เข้าใจผิด - พูดตามตรงฉันหลีกเลี่ยงเพราะมันใช้งานไม่ได้เหมือนภาษาโปรแกรมส่วนใหญ่" - powershell.org/forums/topic/…
Jim Aho

1
หากคุณกำลังเรียกใช้ฟังก์ชันที่มีค่าส่งคืนอย่าใช้ Write-Output ในฟังก์ชันนั้นมิฉะนั้นสตริงนั้นจะถูกส่งกลับแทนค่าที่ส่งคืนของคุณ ซึ่งสามารถก่อให้เกิดความหายนะได้ทุกชนิด
Brain2000

29

Write-Output ส่งเอาต์พุตไปยังไปป์ไลน์ จากนั้นสามารถส่งไปยัง cmdlet อื่นหรือกำหนดให้กับตัวแปร Write-Host ส่งไปยังคอนโซลโดยตรง

$a = 'Testing Write-OutPut'  | Write-Output
$b = 'Testing Write-Host' | Write-Host

Get-Variable a,b

ผลลัพธ์:

Testing Write-Host

Name                           Value                                                                 
----                           -----                                                                 
a                              Testing Write-OutPut                                                  
b                                                  

หากคุณไม่บอก Powershell ว่าจะทำอย่างไรกับเอาต์พุตไปยังไปป์ไลน์โดยกำหนดให้กับตัวแปรหรือไพพ์ไปยังคำสั่ง anoher จากนั้นจะถูกส่งไปยังค่าเริ่มต้นซึ่งโดยปกติจะเป็นคอนโซลดังนั้นผลลัพธ์สุดท้ายจะปรากฏเหมือนกัน .


9

Write-Outputส่งข้อมูลเป็นวัตถุผ่านไปป์ไลน์ ในตัวอย่างคำถามจะส่งผ่านสตริง

write-hostขึ้นอยู่กับโฮสต์ ในคอนโซลเป็นหลักทำwrite-host [console]::WriteLineดูนี้สำหรับข้อมูลเพิ่มเติม


4
เพียงเพื่อชี้แจงสำหรับผู้อ่านในอนาคต Write-Ouputส่งวัตถุ คราวนี้เป็นสตริง แต่โดยทั่วไปแล้วจะส่งวัตถุและโดยปกติไม่จำเป็นที่จะใช้เนื่องจากเป็นวิธีเริ่มต้นในการส่งออกผลลัพธ์ / ข้อมูล :)
Frode F.

5

ความแตกต่างอีกอย่างระหว่าง Write-Host และ Write-Output:

  • Write-Host จะแสดงข้อความบนหน้าจอ แต่ไม่ได้เขียนลงในบันทึก

  • Write-Output เขียนข้อความลงในบันทึก แต่ไม่แสดงบนหน้าจอ

และ Write-Host ถือว่าเป็นอันตราย คุณสามารถดูคำอธิบายรายละเอียดในการเขียนโฮสต์พิจารณาอันตราย


2
ฉันพบว่า Write-Output เป็นอันตรายมากกว่ามาก คุณแน่ใจได้อย่างไรว่าฟังก์ชันส่งคืนผลลัพธ์ที่คุณคาดไว้จริง ๆ และไม่ใช่ผลลัพธ์ขยะที่ไม่คาดคิดจากคำสั่ง
MKesper

6
ฉันคิดว่าWrite-Outputจะแสดงข้อความบนหน้าจอหากคุณเรียกใช้สคริปต์ด้วยตัวเอง ดังนั้นฉันไม่แน่ใจว่าคุณหมายถึงอะไร "Write-Output เขียนข้อความลงในบันทึก แต่ไม่แสดงบนหน้าจอ" เหรอ?
Jim Aho

คุณไม่สามารถมีข้อมูลการส่งคืนการเขียน - เอาต์พุตไปยังหน้าจอได้หากใช้ภายในฟังก์ชันที่คุณจับเอาต์พุตไปยังตัวแปร มันอาจทำลายผลลัพธ์ด้วยซ้ำ Write-Host เหมาะกว่าสำหรับสิ่งนี้
galmok

@Summer Write-Output เป็นอันตรายการเขียนข้อมูลเป็นสิ่งที่ยอดเยี่ยม Write-Output เป็นศัตรูของฟังก์ชัน Powershell ที่มีค่าส่งกลับ
Brain2000

ตามเอกสาร "เริ่มต้นใน Windows PowerShell 5.0 Write-Host เป็นกระดาษห่อสำหรับเขียนข้อมูลซึ่งช่วยให้คุณสามารถใช้ Write-Host เพื่อส่งเอาต์พุตไปยังสตรีมข้อมูลได้"
Phistrom

0

คุณสามารถเข้าใจความแตกต่างระหว่าง cmds ทั้งสองด้วยตัวอย่างด้านล่าง:

เขียนโฮสต์ "msgtxt" | รับบริการเมื่อทำงานด้านบนคุณจะได้รับผลลัพธ์เป็น "msgtxt"

เขียนเอาต์พุต "msgtxt" | รับบริการเมื่อทำงานด้านบนคุณจะได้รับข้อผิดพลาดเนื่องจาก msgtxt ไม่ใช่ชื่อของบริการใด ๆ (ในสภาพที่เหมาะสม) (เนื่องจากคุณกำลังเขียนลงในไปป์ไลน์และจะถูกส่งเป็นอินพุตไปยัง Get-Service)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.