Gostaria de excluir apenas os arquivos criados mais de 15 dias atrás em uma pasta específica. Como eu poderia fazer isso usando o PowerShell?
Gostaria de excluir apenas os arquivos criados mais de 15 dias atrás em uma pasta específica. Como eu poderia fazer isso usando o PowerShell?
Respostas:
As respostas fornecidas apenas excluirão arquivos (que é o que está no título desta postagem), mas aqui está um código que primeiro excluirá todos os arquivos anteriores a 15 dias e, em seguida, excluirá recursivamente todos os diretórios vazios que possam ter sido deixados atrás. Meu código também usa a -Force
opção de excluir arquivos ocultos e somente leitura. Além disso, optei por não usar aliases como o OP é novo para PowerShell e não pode entender o que gci
, ?
, %
, etc, são.
$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"
# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse
E, claro, se você deseja ver quais arquivos / pastas serão excluídos antes de excluí-los, basta adicionar a -WhatIf
opção à Remove-Item
chamada de cmdlet no final das duas linhas.
O código mostrado aqui é compatível com o PowerShell v2.0, mas também mostro esse código e o código mais rápido do PowerShell v3.0 como funções reutilizáveis úteis no meu blog .
simplesmente (PowerShell V5)
Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-15) | Remove-Item -Force
Outra maneira é subtrair 15 dias da data atual e comparar CreationTime
com esse valor:
$root = 'C:\root\folder'
$limit = (Get-Date).AddDays(-15)
Get-ChildItem $root -Recurse | ? {
-not $_.PSIsContainer -and $_.CreationTime -lt $limit
} | Remove-Item
Basicamente, você repete os arquivos no caminho especificado, subtrai o CreationTime
arquivo de cada arquivo encontrado a partir do horário atual e compara com a Days
propriedade do resultado. A -WhatIf
opção informará o que acontecerá sem excluir os arquivos (quais arquivos serão excluídos); remova a opção para excluir os arquivos:
$old = 15
$now = Get-Date
Get-ChildItem $path -Recurse |
Where-Object {-not $_.PSIsContainer -and $now.Subtract($_.CreationTime).Days -gt $old } |
Remove-Item -WhatIf
Tente o seguinte:
dir C:\PURGE -recurse |
where { ((get-date)-$_.creationTime).days -gt 15 } |
remove-item -force
-recurse
é demais, não? A listagem de diretórios é recursiva; a exclusão do item não deve ser feita com crianças incluídas, certo?
O script do Esperento57 não funciona nas versões mais antigas do PowerShell. Este exemplo faz:
Get-ChildItem -Path "C:\temp" -Recurse -force -ErrorAction SilentlyContinue | where {($_.LastwriteTime -lt (Get-Date).AddDays(-15) ) -and (! $_.PSIsContainer)} | select name| Remove-Item -Verbose -Force -Recurse -ErrorAction SilentlyContinue
Se você estiver tendo problemas com os exemplos acima em uma caixa do Windows 10, tente substituir .CreationTime
por .LastwriteTime
. Isso funcionou para mim.
dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force
LastwriteTime
não é o mesmo que CreationTime
, LastwriteTime
é atualizado sempre que o arquivo é modificado.
#----- Define parameters -----#
#----- Get current date ----#
$Now = Get-Date
$Days = "15" #----- define amount of days ----#
$Targetfolder = "C:\Logs" #----- define folder where files are located ----#
$Extension = "*.log" #----- define extension ----#
$Lastwrite = $Now.AddDays(-$Days)
#----- Get files based on lastwrite filter and specified folder ---#
$Files = Get-Children $Targetfolder -include $Extension -Recurse | where {$_.LastwriteTime -le "$Lastwrite"}
foreach ($File in $Files)
{
if ($File -ne $Null)
{
write-host "Deleting File $File" backgroundcolor "DarkRed"
Remove-item $File.Fullname | out-null
}
else
write-host "No more files to delete" -forgroundcolor "Green"
}
}
$Files
estiver vazio, não entrará na instrução foreach . Você deve colocar o foreach na instrução if .