首页 > 解决方案 > 如何使用 PowerShell 脚本删除文本/日志文件的内容,直到第一次出现关键字

问题描述

如何使用 PowerShell 脚本删除所有上述行,直到出现在文本/日志文件中的关键字(第一次出现)?

例如,日志文件的内容是:

删除文件:localhost_access_log.2019-10-23.txt
删除文件:localhost_access_log.2019-10-24.txt
删除文件:localhost_access_log.2019-10-25.txt
删除文件:localhost_access_log.2019-10-26.txt
删除文件:localhost_access_log.2019-10-27.txt
删除文件:localhost_access_log.2019-10-28.txt
删除文件:localhost_access_log.2019-10-29.txt
删除文件:localhost_access_log.2019-10-30.txt
删除文件:localhost_access_log.2019-10-31.txt
删除文件:localhost_access_log.2019-11-01.txt
删除文件:localhost_access_log.2019-11-02.txt
删除文件:localhost_access_log.2019-11-03.txt
删除文件:localhost_access_log.2019-11-04.txt
删除文件:localhost_access_log.2019-11-05.txt
删除文件:localhost_access_log.2019-11-01.txt
删除文件:localhost_access_log.2019-11-02.txt

我选择关键字为“ 2019-11-01.txt

我想删除该关键字之前存在的所有行/内容。所以同一文件中的剩余文本是:

删除文件:localhost_access_log.2019-11-01.txt
删除文件:localhost_access_log.2019-11-02.txt
删除文件:localhost_access_log.2019-11-03.txt
删除文件:localhost_access_log.2019-11-04.txt
删除文件:localhost_access_log.2019-11-05.txt
删除文件:localhost_access_log.2019-11-01.txt
删除文件:localhost_access_log.2019-11-02.txt

我尝试了一些类似下面给出的 PowerShell 脚本,但它没有达到它的目标。它只是删除关键字所在的行。

$content = Get-Content $file
#$keyword = "2019-11-01.txt"
$content = $content.Where({ $_ -like $keyword }, 'SkipUntil') |
           Set-Content $file -Force

标签: powershell

解决方案


试试这个:

$logFile = 'C:\inet\logfiles\mylog.log'
$pattern = '*2019-11-01.txt*'
$match   = $false

$fileHandle     = [System.IO.File]::Create( $logFile + '.tmp' )

foreach($line in [System.IO.File]::ReadLines( $logFile )) {
    if( $line -like $pattern ) {
        $match = $true
    }
    if( $match ) {
        $line += [environment]::NewLine
        $fileHandle.Write([byte[]][char[]]$line, 0, $line.Length )

    }
}

[void]$fileHandle.Close()

Move-Item -Path $logFile -Destination ($logFile + '.bak')     # backup of old logfile
Move-Item -Path ( $logFile + '.tmp' ) -Destination $logFile

推荐阅读