416

大きなファイルの最後の数行を確認する必要があります(通常のサイズは500MB〜2GBです)。tailWindowsPowershell用のUnixコマンドに相当するものを探しています。で利用可能ないくつかの選択肢は、

http://tailforwin32.sourceforge.net/

Get-Content[ファイル名]| Select-Object -Last 10

私にとって、最初の選択肢を使用することは許可されておらず、2番目の選択肢は遅いです。PowerShellのtailの効率的な実装を知っている人はいますか。

4

14 に答える 14

576

-waitGet-Contentでパラメーターを使用します。これにより、ファイルに追加された行が表示されます。この機能はPowerShellv1に存在していましたが、何らかの理由でv2では十分に文書化されていませんでした。

これが例です

Get-Content -Path "C:\scripts\test.txt" -Wait

これを実行したら、ファイルを更新して保存すると、コンソールに変更が表示されます。

于 2010-12-13T09:15:34.443 に答える
263

完全を期すために、Powershell3.0のGet-Contentに-Tailフラグが追加されました。

Get-Content ./log.log -Tail 10

ファイルの最後の10行を取得します

Get-Content ./log.log -Wait -Tail 10

ファイルの最後の10行を取得し、さらに待機します

また、これらの* nixユーザーの場合、ほとんどのシステムはcatをGet-Contentにエイリアスするため、これは通常は機能します。

cat ./log.log -Tail 10
于 2013-03-21T19:04:32.050 に答える
122

PowerShellバージョン3.0以降、Get-Contentコマンドレットには-Tailパラメーターがあります。Get-Contentについては、technetライブラリのオンラインヘルプを参照してください。

于 2012-10-31T12:33:46.117 に答える
27

私はここで与えられた答えのいくつかを使用しましたが、

Get-Content -Path Yourfile.log -Tail 30 -Wait 

しばらくすると記憶がかみ砕かれます。同僚がこのような「テール」を最後の日に残し、最大800MBになりました。Unixテールが同じように動作するかどうかはわかりません(しかし、私はそれを疑っています)。したがって、短期間のアプリケーションに使用することは問題ありませんが、注意してください。

于 2016-05-23T15:08:34.197 に答える
19

PowerShell Community Extensions(PSCX)は、Get-FileTailコマンドレットを提供します。このタスクに適したソリューションのようです。注:非常に大きなファイルでは試しませんでしたが、内容を効率的に調整し、大きなログファイル用に設計されていると説明されています。

NAME
    Get-FileTail

SYNOPSIS
    PSCX Cmdlet: Tails the contents of a file - optionally waiting on new content.

SYNTAX
    Get-FileTail [-Path] <String[]> [-Count <Int32>] [-Encoding <EncodingParameter>] [-LineTerminator <String>] [-Wait] [<CommonParameters>]

    Get-FileTail [-LiteralPath] <String[]> [-Count <Int32>] [-Encoding <EncodingParameter>] [-LineTerminator <String>] [-Wait] [<CommonParameters>]

DESCRIPTION
    This implentation efficiently tails the cotents of a file by reading lines from the end rather then processing the entire file. This behavior is crucial for ef
    ficiently tailing large log files and large log files over a network.  You can also specify the Wait parameter to have the cmdlet wait and display new content
    as it is written to the file.  Use Ctrl+C to break out of the wait loop.  Note that if an encoding is not specified, the cmdlet will attempt to auto-detect the
     encoding by reading the first character from the file. If no character haven't been written to the file yet, the cmdlet will default to using Unicode encoding
    . You can override this behavior by explicitly specifying the encoding via the Encoding parameter.
于 2010-12-13T12:36:46.340 に答える
15

以前の回答へのいくつかの追加。Get-Contentに定義されたエイリアスがあります。たとえば、UNIXに慣れている場合は、が好きかもしれません。また、catともtypeありgcます。だから代わりに

Get-Content -Path <Path> -Wait -Tail 10

あなたは書ける

# Print whole file and wait for appended lines and print them
cat <Path> -Wait
# Print last 10 lines and wait for appended lines and print them
cat <Path> -Tail 10 -Wait
于 2015-06-08T08:08:34.483 に答える
7

おそらく回答者には遅すぎますが、これを試してください

Get-Content <filename> -tail <number of items wanted> -wait
于 2019-07-24T08:12:55.003 に答える
3

Powershell V2以下を使用すると、get-contentはファイル全体を読み取るため、私には役に立ちませんでした。次のコードは私が必要としていたもので機能しますが、文字エンコードに問題がある可能性があります。これは事実上tail-fですが、最後のxバイト、または改行を逆方向に検索する場合は最後のx行を取得するように簡単に変更できます。

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

私はここでこれを行うためのコードのほとんどを見つけました。

于 2014-03-24T20:36:02.190 に答える
3

@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;
    }
}
于 2015-06-11T16:10:23.007 に答える
2

試すWindows Server 2003 Resource Kit Tools

tail.exeこれには、 Windowsシステムで実行できるが含まれています。

https://www.microsoft.com/en-us/download/details.aspx?id=17657

于 2017-11-22T09:14:43.223 に答える
1

多くの有効な答えがありますが、それらのどれもLinuxのtailと同じ構文を持っていません。次の関数は、永続性のためにに保存できます(詳細については、 PowerShellプロファイルのドキュメントを参照してください)。$Home\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

これにより、電話をかけることができます...

tail server.log
tail -n 5 server.log
tail -f server.log
tail -Follow -Lines 5 -Path server.log

これはLinuxの構文に非常に近いものです。

function tail {
<#
    .SYNOPSIS
        Get the last n lines of a text file.
    .PARAMETER Follow
        output appended data as the file grows
    .PARAMETER Lines
        output the last N lines (default: 10)
    .PARAMETER Path
        path to the text file
    .INPUTS
        System.Int
        IO.FileInfo
    .OUTPUTS
        System.String
    .EXAMPLE
        PS> tail c:\server.log
    .EXAMPLE
        PS> tail -f -n 20 c:\server.log
#>
    [CmdletBinding()]
    [OutputType('System.String')]
    Param(
        [Alias("f")]
        [parameter(Mandatory=$false)]
        [switch]$Follow,

        [Alias("n")]
        [parameter(Mandatory=$false)]
        [Int]$Lines = 10,

        [parameter(Mandatory=$true, Position=5)]
        [ValidateNotNullOrEmpty()]
        [IO.FileInfo]$Path
    )
    if ($Follow)
    {
        Get-Content -Path $Path -Tail $Lines -Wait
    }
    else
    {
        Get-Content -Path $Path -Tail $Lines
    }
}
于 2020-01-08T09:55:30.183 に答える
1

次のGitHubリポジトリからWindows用にコンパイルされたすべてのUNIXコマンドをダウンロードできます:https ://github.com/George-Ogden/UNIX

于 2020-07-04T17:41:36.217 に答える
0

非常に基本的ですが、アドオンモジュールやPSバージョンの要件なしで必要なことを実行します。

while ($true) {Clear-Host; gc E:\test.txt | select -last 3; sleep 2 }

于 2013-12-24T03:10:52.977 に答える
0

複数のファイルに関して、このテーマに関する役立つヒントがあります。

PowerShell 5.2(Win7およびWin10)で単一のログファイル(Linuxの'tail -f'など)を追跡するのは簡単です(「Get-ContentMyFile -Tail 1 -Wait」を使用するだけです)。ただし、複数のログファイルを一度に監視するのは複雑に思えます。ただし、PowerShell 7.x +では、「Foreach-Object-Parrallel」を使用する簡単な方法を見つけました。これにより、複数の「Get-Content」コマンドが同時に実行されます。例えば:

Get-ChildItem C:\logs\*.log | Foreach-Object -Parallel { Get-Content $_ -Tail 1 -Wait }
于 2022-01-05T16:30:09.770 に答える