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