Saltar al contenido

Comando equivalente de cola de Unix en Windows Powershell

octubre 20, 2021
apple touch icon@2

Tomé la solución de @ hajamie y la envolví en un envoltorio de script un poco más conveniente.

Agregué una opción para comenzar desde un desplazamiento antes del final del archivo, para que pueda usar la funcionalidad de cola de leer una cierta cantidad desde el final del archivo. Tenga en cuenta que el desplazamiento está en bytes, no en líneas.

También existe la opción de seguir esperando más contenido.

Ejemplos (suponiendo que guarde esto como TailFile.ps1):

.TailFile.ps1 -File .pathtomyfile.log -InitialOffset 1000000
.TailFile.ps1 -File .pathtomyfile.log -InitialOffset 1000000 -Follow:$true
.TailFile.ps1 -File .pathtomyfile.log -Follow:$true

Y aquí está el guión en sí …

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;
    }
}
close