Script de lote "Excluir arquivos mais antigos que"

8

Portanto, no trabalho de fazer backups, preciso de um script em lote que permita excluir arquivos em um diretório especificado, com mais de 3 dias, digamos. Este script será definido como uma tarefa agendada para execução em um horário especificado todos os dias.

Chiggins
fonte
Você está vinculado ao lote? E o PowerShell?
Nate
O Powershell deve ser capaz de funcionar, estou acostumado ao lote e nunca brinquei com o Powershell.
precisa saber é o seguinte

Respostas:

8

Se o PowerShell for aceitável (como deveria, como ativado por padrão no Server 2008+), tente o seguinte:

$numberOfDays = 3
$Now = Get-Date
$TargetFolder = “C:\myoldfiles”
$LastWrite = $Now.AddDays(-$numberOfDays)
$Files = get-childitem $TargetFolder -include *.bak, *.x86 -recurse | Where {$_.LastWriteTime -le “$LastWrite”} 

foreach ($File in $Files)
{
    write-host “Deleting File $File” -foregroundcolor “Red”;
    Remove-Item $File | out-null
} 

Souce aqui .

Nate
fonte
2
+1. Além disso, para fins de teste, você pode adicionar o "-whatif" bandeira: Remove-Item $File -whatif | out-null. Para executar como uma tarefa de agendamento, o trabalho deve especificar o caminho completo para powershell.exe com o script nomeado como argumento.
AndyN
Eu vim com a mesma solução para começar - mas tive problemas com a carga de memória associada à obtenção de todos os arquivos com antecedência.
precisa
13
forfiles -pc: \ pathtofiles \ -m * .rar -d -5 -c "cmd / c del @path"

Onde -5é a idade dos arquivos que você deseja excluir (5 dias ou mais, neste caso). Este script está excluindo .rararquivos - solte o botão -m *.rarse você deseja excluir qualquer tipo de arquivo.

Mark Henderson
fonte
1
De todas essas respostas, essa é a única (até agora) que responde diretamente à pergunta.
John Gardeniers
3

Se você insistir em usar arquivos em lote, Robocopy.exe é sua resposta. É rápido (multithread) e muito robusto. Para o seu cenário, você pode usar o seguinte como um guia:

:: Moves dir & files older than 3 days to i:\Destination
:: Wildcards acceptable
robocopy i:\Source\ i:\Destination\ /MOVE /MIR /MINAGE:3 /ETA
:: Removes the destination tree
rd /s /q i:\destination

Há uma longa lista de opções, por favor, faça a robocopy /? ver todos eles. Você pode até usá-lo para fazer backups incrementais, agendar, criar perfis de backup etc.

Dharma Leonardi
fonte
Todos os + 1s para robocópia! <3 Re seu exemplo: não tenho certeza se a opção / MIR está correta para esta situação, o / MOVE deve cuidar da pergunta de Chiggins. Uma coisa é certa: a robocópia tem várias opções, é necessário um exame cuidadoso.
21412 JamesCW
2

Eu gosto de usar DelEn.exe para isso.

Delen - DELete ENhanced - é uma versão aprimorada do DEL. Ele suporta curingas estendidos e diretórios pai, bem como filtros de data, hora e tamanho. Os arquivos podem ser excluídos da exclusão.

jftuga
fonte
2

Você pode olhar para o DelAge32 de Horst Schaeffer:

http://home.mnet-online.de/horst.muc/wbat32.htm#top

DelAge32 - ver. 2.3 (c) 2003-2008, Horst Schaeffer
Deletes or moves files (path with file pattern) by age (number of days)
Syntax:  DelAge32 filespec age [options]
Options:
  /created /accessed /modified (default) - file stamp used to evaluate age
  /includeRO - include read-only files
  /includeH  - include hidden files
  /includeS  - include system files
  /includeRHS -include read-only, hidden and system files
  /recurse   - include subdirectories
  /subonly   - /recurse excluding initial directory
  /rd        - remove empty subdirectories
  /move path - move files to specified path
  /preview   - list, but no action
  /quiet     - no output

Seu comando pode ser tão simples quanto:

delage32.exe c:\logdirectory\*.log 3

Eu tenho esse comando sendo executado como uma tarefa agendada.

RobW
fonte
Isso é sinalizado como uma ameaça no Cylance.
Sun
Delage32.exe Obtém uma classificação 0/53 em virustotal.com, onde zero significa que nenhuma ameaça foi detectada entre as 53 principais ferramentas de antivírus. Você pode querer mudar seu AV para algo mais mainstream.
RobW
Não é minha escolha. Estou apenas avisando para qualquer um que usa Cylance, quer renunciar delage32 ou uso forfiles
Sun
1

Este é um script do PowerShell que escrevi para fazer o que você deseja - também um pouco mais. Eu o uso para limpar logs e outros arquivos temporários.

purge-dem-logs.cmd

powershell.exe -command "& 'c:\purgelogs\purgelogs.ps1' -Filepath D:\SQL\backup\ -filemask *.bak -Maxdays 14 "

purgelogs.ps1:

Param ($filepath, $filemask, $maxdays, [switch]$recurse)

   if (($FilePath -eq $null) -or ($FileMask -eq $null) -or ($MaxDays -eq $null)) {
      write-host "Usage .\purgelogs.ps1 -filepath [Path] -filemask [Mask] -masdays [Max Days]"
      write-host " "
      write-host "Example: "
      write-host "    .\purgelogs.ps1 -filepath c:\temp -filemask *.log -maxdays 30"
      break
      }

   if (Test-Path $FilePath) {

      $FilePath += "*"

      $Now = Get-Date

      $LastWrite = $Now.AddDays(-$MaxDays)

      write-host "Last write time " $LastWrite
      if ($recurse) {
         $Files = get-childitem $FilePath -include $FileMask -recurse | Where {$_.LastWriteTime -le "$LastWrite"}
      } else {
         $Files = get-childitem $FilePath -include $FileMask | Where {$_.LastWriteTime -le "$LastWrite"}
      }

      if ($Files -eq $null) {

         write-host "No matching files found"

      } else {

          foreach ($File in $Files)
            #You can add -whatif to see the consequence û Remove-item $File -Whatif
            {
            write-host "Deleting File $File" -foregroundcolor "Red"; Remove-Item $File | out-null
            }
         }
      }
   Else
      {
      Write-Host "The Folder $FilePath Does Not Exist!"
      }
Ian Murphy
fonte
1

Isso não funcionará para computadores remotos. Os administradores precisam gerenciar vários computadores. Abaixo está o script que pode ser usado para excluir pastas em vários computadores remotos sem precisar fazer login.

O script abaixo excluirá pastas com mais de 15 dias. você pode alterar o parâmetro $ days.

D $ \ Arquivos de programas (x86) \ Research In Motion \ BlackBerry Enterprise Server \ Logs é o caminho UNC da pasta Blackberry Log. Você pode alterar o diretório em que seus logs / pastas estão localizados.

Liste todos os nomes de servidor no arquivo servers.txt e ele deve estar localizado no mesmo diretório que este script.

cd C:\Scripts\Powershellscripts\deletefiles ----> change it to the directory you wanna out this script to

$Days = "15" 
$Now = Get-Date
$LastWrite = $Now.AddDays(-$days)
$server = get-content servers.txt
foreach ($node in $server)
{
get-childitem -recurse "\\$node\D$\Program Files (x86)\Research In Motion\BlackBerry Enterprise Server\Logs" | Where-Object {$_.LastWriteTime -le $LastWrite} | remove-item -recurse -force
}

Salve o script como .ps1 e execute-o. Você pode agendá-lo via arquivo em lotes. Dessa forma, você precisa adicionar o comando Alterar Diretório no início do script.

Diverta-se.

VJ Kumar
fonte
0

Como uma abordagem alternativa: em vez de depender de consultar o sistema de arquivos para obter os horários de criação de arquivos (e acessar os mesmos arquivos por vários dias, até que eles expirem), você pode adicionar o arquivo a um índice próprio no momento da criação. O índice pode ser tão simples quanto um arquivo nomeado após a data de criação, armazenado em um local conhecido, com um arquivo por linha.

Se você tiver um aplicativo multithread / multiprocess criando arquivos, convém que seu índice seja tratado de uma maneira mais sofisticada.

A vantagem seria que você sempre tem uma lista de arquivos relativamente simples processada, criada em um determinado dia, para iterar, em vez de precisar pedir repetidamente ao sistema de arquivos detalhes.

(Isso dependeria do aplicativo e da criação do arquivo, sendo gerenciado por você e não por terceiros).

Tim Barrass
fonte