คุณสามารถใช้ไฟล์ล็อกข้อความธรรมดาเพื่อควบคุมการทำงานและติดตามกิจกรรมทั้งหมดในสคริปต์ 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 ทั้งหมดและเอาต์พุตของพวกเขาจะถูกล็อก