วิธีที่ดีที่สุดในการเขียนไปยังคอนโซลใน PowerShell


142

ฉันมีความสับสนเล็กน้อยเกี่ยวกับวิธีการพิมพ์ (echo) ไปยังคอนโซล ฉันได้เห็นว่ามีหลายวิธีในการเขียนผลลัพธ์ไปยังคอนโซลเช่น:

Write-Host "Hello world1"
"Hello World2"
Out-Host -InputObject "Hello World3"

ทั้งสามวิธีจะพิมพ์ไปที่คอนโซล ตรงกลางเป็นอย่างใดอย่างง่ายและ verbose น้อยกว่าและใช้งานง่ายขึ้น ฉันยังพบว่าเมื่อคุณเขียนฟังก์ชั่นเช่น:

function GetValues()
{
    "1"
    "2"
}

มันยังคงส่งคืนสองสายในไปป์ไลน์:

และฉันยังสามารถพิมพ์ค่าได้:

foreach ($s in GetValues)
{
    Write-Host "s: " $s
}

สิ่งที่ฉันได้พบคือการใช้เพียงสตริงที่ยกมาไม่ได้ปรากฏบนโฮสต์ที่กำหนดเองและฉันต้องใช้Write-Hostเพื่อรับค่าเพื่อพิมพ์บนโฮสต์ที่กำหนดเอง

อย่างใดฉันก็พบว่าสับสนนี้ คือ"Print something"ควรจะเป็นชื่อแทนWrite-Hostหรือสิ่งที่เป็นความตั้งใจ?

คำตอบ:


101

พฤติกรรมเริ่มต้นของ PowerShell เป็นเพียงการทิ้งทุกสิ่งที่หลุดออกจากไปป์ไลน์โดยไม่ได้รับการเก็บรวบรวมจากไปป์ไลน์อื่นหรือถูกกำหนดให้กับตัวแปร (หรือเปลี่ยนเส้นทาง) ไปOut-Hostยัง Out-Hostเห็นได้ชัดว่าอะไรขึ้นกับโฮสต์

การปล่อยให้สิ่งที่หลุดออกจากท่อไม่ใช่สิ่งทดแทนWrite-Hostที่มีอยู่ด้วยเหตุผลเพียงอย่างเดียวของการแสดงผลข้อความในแอปพลิเคชันโฮสต์

หากคุณต้องการเอาต์พุตให้ใช้Write-*cmdlets หากคุณต้องการค่าส่งคืนจากฟังก์ชั่นแล้วเพียงแค่ทิ้งวัตถุที่มีโดยไม่มี cmdlet


1
ฉันพิมพ์สคริปต์. vbs แล้ว เพียงบรรทัดของรหัสนั้นและมันทำให้ฉันเกิดข้อผิดพลาด
FrenkyB

58

ตรงกลางเขียนไปป์ไลน์ Write-HostและOut-Hostเขียนไปยังคอนโซล 'echo' เป็นนามแฝงWrite-Outputที่เขียนไปยังไพพ์ไลน์เช่นกัน วิธีที่ดีที่สุดในการเขียนไปยังคอนโซลจะใช้Write-Hostcmdlet

เมื่อวัตถุถูกเขียนไปยังไปป์ไลน์มันสามารถใช้ได้โดยคำสั่งอื่น ๆ ในห่วงโซ่ ตัวอย่างเช่น:

"hello world" | Do-Something

แต่สิ่งนี้จะไม่ทำงานตั้งแต่Write-Hostเขียนไปที่คอนโซลไม่ใช่ไปป์ไลน์ (Do-Something จะไม่ได้รับสตริง):

Write-Host "hello world" | Do-Something

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

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