ฉันใช้วิธีแก้ปัญหาของ @hajamie และห่อมันลงในกระดาษห่อหุ้มสคริปต์ที่สะดวกกว่าเล็กน้อย
ฉันได้เพิ่มตัวเลือกให้เริ่มจากอ็อฟเซ็ตก่อนสิ้นสุดไฟล์ดังนั้นคุณสามารถใช้ฟังก์ชั่นคล้ายหางของการอ่านจำนวนหนึ่งจากส่วนท้ายของไฟล์ หมายเหตุออฟเซ็ตเป็นไบต์ไม่ใช่บรรทัด
นอกจากนี้ยังมีตัวเลือกให้รอเนื้อหาเพิ่มเติมต่อไป
ตัวอย่าง (สมมติว่าคุณบันทึกเป็น TailFile.ps1):
.\TailFile.ps1 -File .\path\to\myfile.log -InitialOffset 1000000
.\TailFile.ps1 -File .\path\to\myfile.log -InitialOffset 1000000 -Follow:$true
.\TailFile.ps1 -File .\path\to\myfile.log -Follow:$true
และนี่คือสคริปต์ของตัวเอง ...
param (
[Parameter(Mandatory=$true,HelpMessage="Enter the path to a file to tail")][string]$File = "",
[Parameter(Mandatory=$true,HelpMessage="Enter the number of bytes from the end of the file")][int]$InitialOffset = 10248,
[Parameter(Mandatory=$false,HelpMessage="Continuing monitoring the file for new additions?")][boolean]$Follow = $false
)
$ci = get-childitem $File
$fullName = $ci.FullName
$reader = new-object System.IO.StreamReader(New-Object IO.FileStream($fullName, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [IO.FileShare]::ReadWrite))
#start at the end of the file
$lastMaxOffset = $reader.BaseStream.Length - $InitialOffset
while ($true)
{
#if the file size has not changed, idle
if ($reader.BaseStream.Length -ge $lastMaxOffset) {
#seek to the last max offset
$reader.BaseStream.Seek($lastMaxOffset, [System.IO.SeekOrigin]::Begin) | out-null
#read out of the file until the EOF
$line = ""
while (($line = $reader.ReadLine()) -ne $null) {
write-output $line
}
#update the last max offset
$lastMaxOffset = $reader.BaseStream.Position
}
if($Follow){
Start-Sleep -m 100
} else {
break;
}
}