471 votes

Commande équivalente de queue UNIX dans Windows Powershell

- Je regarder les quelques dernières lignes d'un fichier volumineux (taille typique est de 500 mo à 2 go). Je suis à la recherche d'un équivalent de la commande Unix tail pour Windows Powershell. Quelques solutions de rechange disponibles sur sont,

http://tailforwin32.sourceforge.net/

et

Get-Content [nom de fichier] | Select-Object -Dernier 10

Pour moi, il n'est pas permis d'utiliser la première solution, et la deuxième solution est lente. Personne ne sait d'une mise en œuvre efficace de la queue pour PowerShell.

638voto

ravikanth Points 9573

Avez-vous essayé - attente paramètre avec Get-Content ? Cela montre des lignes lorsqu’elles obtenir ajoutées au fichier. C’était là en PowerShell v1 mais pour une raison non documenté dans v2.

Voici un exemple

Une fois que vous exécutez ceci, essayez la mise à jour et de l’enregistrement du fichier. Vous verrez les changements sur la console

307voto

George Mauer Points 22685

Par souci d’exhaustivité, je mentionnerai que Powershell 3.0 a maintenant un - drapeau de queue sur Get-Content

Obtient les 10 dernières lignes du fichier

123voto

Dan Blanchard Points 2757

À partir de PowerShell version 3.0, la cmdlet Get-Content a un -queue paramètre qui devrait vous aider. Voir l’aide en ligne de bibliothèque technet pour Get-Content.

19voto

Roman Kuzmin Points 13913

PowerShell Community Extensions fournit la `` applet de commande. Il ressemble à une solution appropriée pour la tâche. Remarque : je ne cherchais pas elle avec des fichiers très volumineux, mais la description dit il efficacement le contenu des queues et elle est conçue pour les gros fichiers journaux.

4voto

hajamie Points 638

Étant donné que get-content lit tout le fichier, il est d'aucune utilité pour moi. Le code suivant fonctionne pour ce que j'en avais besoin, même si il y a probablement quelques problèmes avec l'encodage des caractères. C'est effectivement tail-f, mais il pourrait facilement être modifiés pour obtenir le dernier x octets, ou le dernier x lignes, si vous voulez la recherche vers l'arrière pour les sauts de ligne.

$filename = "\wherever\your\file\is.txt"
$reader = new-object System.IO.StreamReader(New-Object IO.FileStream($filename, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [IO.FileShare]::ReadWrite))
#start at the end of the file
$lastMaxOffset = $reader.BaseStream.Length

while ($true)
{
    Start-Sleep -m 100

    #if the file size has not changed, idle
    if ($reader.BaseStream.Length -eq $lastMaxOffset) {
        continue;
    }

    #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
}

J'ai trouvé le plus de code pour faire cela ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X