Как я могу фильтровать по дням и месяцам в txt-файле с помощью powershell

#powershell

Вопрос:

Я использую вход в свой скрипт и пишу это с указанием дня, месяца и времени:

 $LogTime = Get-Date -Format "dd-MM HH:mm"
 

Я хочу удалить из файла все строки старше месяца
Я хотел сделать это так, но это не работает:

 $DateOld = (get-date (get-date).addDays(-30) -UFormat "%d-%m")
    
$RemoveLog = get-content -Path C:.....LogUserLog.txt | where {($_.split('-'))[1] -gt $DateOld} | Set-Content "C:......Logout.txt" | Out-Null
Remove-Item -Path C:........LogUserLog.txt -Force | Out-Null
Rename-Item -Path "C:.........Logout.txt" -NewName "UserLog.txt" | Out-Null
 

Строка в журнале выглядит так:

20-09 11:30 ::: Строка с информацией о журнале

Ответ №1:

Вы можете использовать [datetime]::ParseExact() метод, чтобы прочитать даты и время вашего файла как [datetime] объекты. Вы можете использовать Move-Item для перезаписи файла новое имя, используя его -Force параметр.

 $DateOld = (Get-Date).AddDays(-30)

Get-Content UserLog.txt | Where {
    [datetime]::ParseExact([string](-split $_)[0..1],'dd-MM HH:mm', 
    [System.Globalization.DateTimeFormatInfo]::InvariantInfo) -ge $DateOld
} | Set-Content out.txt
Move-Item out.txt UserLog.txt -Force
 

Использование -split value , value разбиения на основе одного разделителя пробелов. Поскольку нам нужны только первые два элемента, мы используем диапазон 0..1 для первых двух результирующих элементов. Приведение [string] к соединению разделенных элементов с разделителем пробелов.

Комментарии:

1. Большое вам спасибо за вашу помощь, это то решение, которое я искал!

Ответ №2:

Что-то вроде этого. Примечания: -массив powershell замедляется на больших массивах, тогда вам будет лучше использовать общий список.

  • это всего лишь первый набросок, в зависимости от точных требований и файла журнала вам потребуется некоторая тонкая настройка и / или обработка исключений, но вы должны понять идею:
 #tmp 20 09 2021

$logfile = 'your path'
[array]$log = Get-Content $logfile
$newLog = @()
$limitDate = (Get-Date).AddDays(-30)
foreach ($line in $log) {
  $regex = [regex]::match($line, '(d{2}-d{2})sd{2}:d{2}')
  if($regex.Success -eq 'True') {
    $lineDate = [datetime]::ParseExact($regex.Groups[1].Value.ToString(), "dd-MM", $null)
    if ($lineDate -ge $limitDate) {
      $newLog  = $line
    }
  }
  else {
    [console]::WriteLine('Big Exception in Logfile! Will Quit')
    exit
  }

}

Remove-Item $logfile -Force
if(-not (Test-Path $logfile)) {
  $newLog | Out-File $logfile
}
else {
  [console]::WriteLine('Big Exception in Logfile! Please Investigate')
}