मैंने @ 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;
}
}