Eu percebo que esta é uma pergunta de 4 anos de idade neste momento. Mas imaginei adicionar uma nova resposta, uma vez que atualmente não há outras respostas aprovadas.
A maneira como eu faço isso é analisar a data em um objeto DateTime
real a partir do nome do arquivo. Então você pode usar comparações de datas normais em vez de comparações de strings. A maneira mais comum de fazer isso é usar uma propriedade calculada como parte de uma instrução Select-Object
. No exemplo abaixo, adicionamos uma propriedade calculada chamada ParsedDate
à saída existente.
$RetainedDays = 7
$FileNameRegex = "\w+_(\d+)\.\w+"
$culture = [System.Globalization.CultureInfo]::InvariantCulture
$ProcessFiles = Get-ChildItem -Path $RootPath -Recurse |
Select-Object *,@{
L='ParsedDate';
E={ if ($_.Name -match $FileNameRegex) {
$strDate = $matches[1];
[DateTime]::ParseExact($strDate,"yyyyMMdd",$culture)
}
}
} | Where { $_.ParsedDate -lt (Get-Date).AddDays(-$RetainedDays) }
A expressão regular, na verdade, torna as coisas mais complicadas do que deveriam ser. Se todos os seus arquivos tiverem exatamente o mesmo padrão de nomenclatura de app_ < DATA > .log , você poderá ignorar o Regex e simplificar permitindo que ParseExact
faça todo o trabalho dessa maneira. Você só precisa escapar dos caracteres literais na string de formato, envolvendo-os com aspas simples.
$RetainedDays = 7
$culture = [System.Globalization.CultureInfo]::InvariantCulture
$ProcessFiles = Get-ChildItem -Path $RootPath -Recurse | Select FullName,@{
L='ParsedDate';
E={ [DateTime]::ParseExact($_.Name,"'app_'yyyyMMdd'.log'",$culture) }
} | Where { $_.ParsedDate -lt (Get-Date).AddDays(-$RetainedDays) }
Tecnicamente falando, você também pode fazer a análise de data dentro da cláusula Where e pular a cláusula Select intermediária. Mas vou deixar isso como um exercício para o leitor.