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
