ค้นหาเว็บไซต์

PowerShell Write-Host ไปยังไฟล์ [พร้อมตัวอย่าง]


เมื่อเร็วๆ นี้ ฉันจำเป็นต้องเขียนเอาต์พุตของ Write-Host ไปยังไฟล์ใน PowerShell ฉันทำการวิจัยอย่างกว้างขวางเพื่อค้นหาแนวทางและแนวทางปฏิบัติที่ดีที่สุดที่แตกต่างกัน ในบทช่วยสอนนี้ เราจะพูดถึงทุกอย่างเกี่ยวกับ PowerShell Write-Host เพื่อจัดทำไฟล์พร้อมตัวอย่าง

หากต้องการเขียนเอาต์พุตของ Write-Host ไปยังไฟล์ใน PowerShell คุณสามารถใช้ cmdlets Start-Transcript และ Stop-Transcript เพื่อบันทึกเอาต์พุตคอนโซลทั้งหมด หรือเปลี่ยนเส้นทางสตรีมข้อมูลด้วย 5>&1 ใน PowerShell 5.0 และใหม่กว่า อีกวิธีหนึ่งคือการแทนที่ฟังก์ชัน Write-Host เพื่อรวม Out-File cmdlet ซึ่งจะส่งเอาต์พุตไปยังทั้งคอนโซลและไฟล์ที่ระบุ

ทำความเข้าใจกับการเขียนโฮสต์ใน PowerShell

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

เปลี่ยนเส้นทางเอาต์พุตการเขียนโฮสต์ไปยังไฟล์

แม้ว่า Write-Host ได้รับการออกแบบมาเพื่อส่งออกไปยังคอนโซล แต่ก็มีวิธีแก้ปัญหาชั่วคราวในการจับเอาต์พุตนี้เป็นไฟล์ เรามาหารือถึงวิธีการบางอย่างและวิธีนำไปใช้

1. การใช้ Start-Transcript และ Stop-Transcript

วิธีหนึ่งในการบันทึกทุกสิ่งที่ปรากฏบนคอนโซล รวมถึงเอาต์พุต Write-Host ใน PowerShell ไปยังไฟล์ คือการใช้ cmdlets Start-Transcript และ Stop-Transcript cmdlet เหล่านี้เริ่มและหยุดการเขียนการโต้ตอบทั้งหมดกับคอนโซล PowerShell

Start-Transcript -Path "C:\MyFolder\Transcript.txt"
Write-Host "This is a message for the console and transcript file."
Stop-Transcript

สคริปต์นี้จะสร้างการถอดเสียงของเอาต์พุตคอนโซลทั้งหมด รวมถึงคำสั่ง Write-Host และบันทึกลงใน Transcript.txt

หลังจากที่ฉันรันสคริปต์ PowerShell โดยใช้โค้ด VS คุณจะเห็นผลลัพธ์ในภาพหน้าจอด้านล่าง

2. การใช้ Out-File กับ Tee-Object

อีกวิธีหนึ่งคือการใช้ Out-File cmdlet ร่วมกับ Tee-Object Tee-Object cmdlet ใน PowerShell ช่วยให้คุณสามารถส่งออกไปยังคอนโซลและไฟล์พร้อมกันได้

"Output from Write-Host" | Tee-Object -FilePath "C:\MyFolder\Output.txt"
Write-Host "This message will appear in the console, but not in the file."

ในตัวอย่างนี้ เฉพาะบรรทัดแรกเท่านั้นที่จะถูกเขียนลงใน Output.txt เนื่องจาก Write-Host จะไม่ส่งข้อมูลไปป์ไลน์

3. การใช้ 5>&1 เพื่อเปลี่ยนเส้นทางสตรีมข้อมูล

เริ่มต้นใน Windows PowerShell 5.0 Write-Host เป็นตัวตัดคำสำหรับ Write-Information ซึ่งช่วยให้คุณสามารถเปลี่ยนเส้นทางสตรีมข้อมูล (5) ไปยังสตรีมเอาต์พุตที่สำเร็จ (1) แล้วไปที่ไฟล์.

Write-Host "This will go to the file." 5>&1 | Out-File "C:\MyFolder\HostOutput.txt"

คำสั่งนี้จะเปลี่ยนเส้นทางเอาต์พุต Write-Host ไปยัง HostOutput.txt

4. การใช้ฟังก์ชันเพื่อจับภาพ Write-Host

ใน PowerShell คุณยังสามารถสร้างฟังก์ชันแบบกำหนดเองที่แทนที่ Write-Host เพื่อบันทึกเอาต์พุตและเปลี่ยนเส้นทางไปยังไฟล์

function Write-Host {
    param([string]$message)
    $message | Out-File "C:\MyFolder\HostOutputOverride.txt" -Append
    Microsoft.PowerShell.Utility\Write-Host $message
}

Write-Host "This message will go to both the console and the file."

ฟังก์ชันนี้จะเพิ่มข้อความ Write-Host ทุกข้อความต่อท้าย HostOutputOverride.txt ขณะที่ยังคงแสดงในคอนโซล

5. การใช้โฮสต์แบบกำหนดเอง

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

class CustomHost : System.Management.Automation.Host.PSHost
{
    # Implement required members...
}

$host = New-Object CustomHost
$host.ui.WriteLine("Redirected to file") | Out-File "C:\Output\CustomHostOutput.txt"

นี่เป็นตัวอย่างที่เรียบง่าย และการใช้งานโฮสต์แบบกำหนดเองแบบเต็มจะต้องมีโค้ดเพิ่มเติมเพื่อกำหนดสมาชิกคลาส PSHost ได้อย่างสมบูรณ์

แนวทางปฏิบัติที่ดีที่สุดและข้อควรพิจารณา

เมื่อเปลี่ยนเส้นทางเอาต์พุต Write-Host ไปยังไฟล์ ให้พิจารณาแนวทางปฏิบัติที่ดีที่สุดต่อไปนี้:

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

บทสรุป

แม้ว่า Write-Host จะใช้เพื่อแสดงข้อความในคอนโซลใน PowerShell เป็นหลัก หลายวิธีเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ใน PowerShell

ในบทช่วยสอน PowerShell นี้ ฉันได้อธิบาย 5 วิธีที่แตกต่างกันในการเขียนเอาต์พุตของ Write-Host ไปยังไฟล์ใน PowerShell

บทความที่เกี่ยวข้อง