我有几台笔记本电脑正在为进程转换为txt文件生成每日活动日志。我已经弄清楚如何编写脚本以便每天将日志附加到一个主文件中,但现在我关注文件大小。我想在我的主文件中保留60天的数据。
这是我的数据格式:
2016-06-23T04:02:33,JE5030UA,88011702312014569339,0000000034626,01451560610600980
使用Get-Date.AddDays(-60)
我可以获得截止日期,但它的格式为MM/dd/yyy
。
如果我设置一个变量来获取与我的文件(Get-Date -format 'yyyyMMdd
)格式相同的日期,我就无法使用.AddDays()
方法来获取截止日期。
到目前为止我已经走了多远。我包含代码,但那里并不多。附加文件的脚本非常简单。我无法相信清除旧记录很困难。
我的问题:
答案 0 :(得分:0)
查看以下代码以从组合日志中读取,然后过滤掉日期范围内的行。你从(get-date).AddDays()获得一个DateTime对象;你从文件中的时间戳得到一个DateTime对象,然后你可以比较它们。无论如何,这是一种做法。
$cutoffDate = (get-date).AddDays(-60);
$fileContents = get-content C:\your\path\combinedLog.txt
foreach($line in $fileContents)
{
write-host "Current line = $line"
$words = $line.Split(',')
$date=get-date $words[0];
write-host "Date of line = $date"
if($date -gt $cutoffDate)
{
# Append $line to your trimmed log
}
}
答案 1 :(得分:0)
由于您使用的是ISO日期格式,因此您可以相应地删除早于指定截止日期的记录formatting截止日期,并将每行的第一个字段与之比较:
$file = 'C:\path\to\your.log'
$cutoff = (Get-Date).AddDays(-60).ToString('yyyy-MM-dd\THH:mm:ss')
(Get-Content $file) |
Where-Object { $_.Split(',')[0] -ge $cutoff } |
Set-Content $file
但是,旋转日志通常比清除单个文件更好。每天将您的日志写入不同的文件,例如像这样:
... | Set-Content "C:\path\to\master_$(Get-Date -f 'yyyyMMdd).log"
因此您只需按上次修改日期删除日志:
$cutoff = (Get-Date).AddDays(-60)
Get-ChildItem 'C:\log\folder\master_*.log' |
Where-Object { $_.LastWriteTime -lt $cutoff } |
Remove-Item