Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Windows Server

การเขียนเอาต์พุตลงไฟล์ล็อกในสคริปต์ PowerShell

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

ในกรณีที่ง่ายที่สุด หากคุณต้องการเขียนเอาต์พุตของข้อความข้อมูลหรือผลลัพธ์คำสั่ง PowerShell ลงในไฟล์ล็อกข้อความ สามารถใช้รูปแบบใดรูปแบบหนึ่งต่อไปนี้เพื่อเปลี่ยนทิศทางเอาต์พุต PS ไปยังไฟล์ข้อความ:

Write-Output "Files are successfully created in $env:computername" >> C:\PS\Logs\TestLog.txt
Add-Content -Path C:\PS\Logs\TestLog.txt -Value "Files are successfully created in $env:computername"
"Files are successfully created in $env:computername" | Out-File -FilePath C:\PS\Logs\TestLog.txt –Append

ในทุกกรณี คำสั่งเหล่านี้จะเพิ่มบรรทัดใหม่ลงในไฟล์ txt พร้อมกับข้อความที่คุณระบุ

หากต้องการเขียนทับเนื้อหาไฟล์ล็อกทุกครั้ง ให้ใช้คำสั่ง Set-Content

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

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

สามารถสร้างฟังก์ชันได้ดังนี้:

$Logfile = "C:\PS\Logs\proc_$env:computername.log"
function WriteLog
{
    Param ([string]$LogString)
    $Stamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")
    $LogMessage = "$Stamp $LogString"
    Add-content $LogFile -value $LogMessage
}

จากนั้นเรียกใช้ฟังก์ชัน WriteLog เมื่อต้องการบันทึกล็อกบางอย่าง

WriteLog "The script is run"
WriteLog "Calculating…."
Start-Sleep 20
WriteLog "The script is successfully executed"

ตอนนี้คุณสามารถเห็นเวลาของแต่ละรายการในไฟล์ล็อกได้

คุณสามารถแทนที่การเรียก Write-Host ด้วย LogWrite ในสคริปต์ของคุณได้

PowerShell มีฟีเจอร์ transcript ในตัวเพื่อบันทึกคำสั่งและเอาต์พุตทั้งหมดที่แสดงในคอนโซล PS ลงในไฟล์ล็อกข้อความ

ในการบันทึกเซสชัน PowerShell ปัจจุบัน ใช้คำสั่ง Start-Transcript

หลังจากรันคำสั่ง จะมีข้อความปรากฏแสดงไฟล์ที่บันทึกเอาต์พุตของคำสั่งทั้งหมด โดยค่าเริ่มต้น ไฟล์ล็อกจะอยู่ในโปรไฟล์ผู้ใช้ปัจจุบัน:

Transcript started, output file is C:\Users\user\Documents\PowerShell_transcript.DESKTOP-P2FHTKQ.+IzDgZiN.20210908163729.txt

คุณสามารถระบุพาธไปยังไฟล์ข้อความได้ดังนี้:

Start-Transcript -Append C:\PS\Logs\PSScriptLog.txt

ตัวเลือก –Append บ่งชี้ว่าเซสชันใหม่จะถูกบันทึกต่อท้ายไฟล์ (โดยไม่เขียนทับ)

รันคำสั่ง PowerShell บางอย่างที่ส่งผลลัพธ์ไปยังคอนโซล เช่น ให้แสดงรายการกระบวนการที่ทำงานอยู่ บริการ และสถานะการจำลอง AD:

Get-Process| where-object {$_.WorkingSet -GT 500000*1024}|select processname,@{l="Used RAM(MB)"; e={$_.workingset / 1mb}} |sort "Used RAM(MB)" –Descending
Get-Service | Where-Object {$_.status -eq 'Running'}
Get-ADReplicationFailure -Target mun-dc01

หยุดการบันทึกล็อกสำหรับเซสชัน PowerShell ปัจจุบัน:

Stop-Transcript

จากนั้นเปิดไฟล์ล็อก transcript

ตามที่คุณเห็น ล็อกแสดงประวัติทั้งหมดของคำสั่ง PowerShell ที่รันในคอนโซลและเอาต์พุตทั้งหมด

ข้อผิดพลาดและคำเตือนทั้งหมดก็ถูกล็อกเช่นกัน ซึ่งสะดวกมากเมื่อแก้ไขข้อบกพร่องของสคริปต์ PowerShell ที่ซับซ้อน

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

โดยใช้ตัวเลือก Group Policy Turn on PowerShell Transcription (Computer Configuration → Administrative Templates → Windows Components → Windows PowerShell) คุณสามารถเปิดใช้งานการบันทึกล็อกอัตโนมัติของคำสั่ง PowerShell ทั้งหมดและเอาต์พุตบนคอมพิวเตอร์ หลังจากอัปเดตการตั้งค่า GPO บนคอมพิวเตอร์ ไฟล์ล็อกข้อความแยกจะถูกสร้างขึ้นสำหรับแต่ละกระบวนการ powershell.exe ที่ทำงาน และคำสั่ง PS ทั้งหมดและเอาต์พุตของพวกเขาจะถูกล็อก