Usando FORFILES para excluir pastas com mais de 2 dias

1

aqui está o que estou tentando fazer:

Use o comando forfiles em um script .cmd para excluir pastas de um caminho especificado que seja mais antigo que e. g. 2 dias em uma máquina win7.

Editar: A situação é a seguinte no caminho X: \ backups são pastas que contêm backups diários e. g. 25.06.2014 próxima pasta 24.06.2014 e assim por diante.

Minhas perguntas sobre isso agora são:

  • / d na ajuda sempre enfatiza --files--. Então, não tenho certeza se isso funciona para pastas também.
  • especialmente eu não sei o que faria em combinação com / s. Então, seria apenas executar as pastas e excluir os arquivos - mas e se já a pasta pai era muito antiga? Em um sidenote, todo o conceito de recursividade não é claro para mim e o que significa que eu não fui capaz de descobrir. Significa apenas passar pelas pastas, certo?
  • Se eu fosse usar um IF-Statement, teria de usar 2 Variable @ISDIR e @FDATE. Com esta solução, não sei como combinar 2 If-Statements no comando forfiles e, além disso, não tenho certeza se @FDATE é novamente apenas para arquivos e não para pastas.

Então, como fazer isso certo?

Referência de forfiles: link

Saudações!

    
por user54512 24.06.2014 / 19:35

3 respostas

6

Solução

Apesar de seu nome, o comando forfiles é capaz de lidar com as pastas e dos arquivos. Aqui está um script em lote que faz o trabalho:

@echo off
setlocal

set target=X:\backups
set days=-2

for /f "usebackq delims=" %%G in (
'forfiles /p "%target%" /c "cmd /c if /i @isdir == true echo @path" /d %days% 2^>nul'
) do echo rd /s /q "%%~G"

pause
endlocal & exit /b

Como funciona

Primeiro, as variáveis target e days são inicializadas. O primeiro é definido para a pasta que você deseja digitalizar e o último é a quantidade de dias. Valores negativos significam mais antigos ou iguais .

O comando forfiles é executado especificando a pasta e o número de dias que foram definidos anteriormente. Para cada resultado, a variável especial @isdir é verificada: se o valor for true , a entrada atual será uma pasta e seu @path será ecoado. A saída do comando é então analisada para obter todas as pastas correspondentes e excluí-las. Por motivos de segurança, há um comando echo extra para que você possa verificar se as pastas corretas foram removidas.

Ao usar a opção recursiva ( /s ), todos os arquivos, pastas e suas subpastas são processados. Neste caso você não quer; caso contrário, você pode acabar excluindo subpastas antigas contidas em pastas mais novas, que não devem ser tocadas.

Leitura adicional

por 30.06.2014 / 00:12
1

O PowerShell de uma linha não chega até você. Não inclui o caminho completo para a lista de arquivos. Além disso, você pode precisar recorrer. Isso funciona:

get-childitem "D: \ backup" | {$ .psiscontainer -e $ .lastwritetime -le (get-date) .adddays (-0)} |% {remove-item  D: \ backup \ $ _ -force -recurse -whatif}
por 22.03.2016 / 21:19
0

Aqui está uma abordagem do PowerShell de uma linha:

get-childitem "x:\backups" |? {$_.psiscontainer -and $_.lastwritetime -le (get-date).adddays(-2)} |% {remove-item $_ -force -whatif}

Você pode ajustar o limite de idade pelo parâmetro adddays. Isso ainda está no modo "WhatIf", então você pode testá-lo primeiro e ver o que aconteceria. Remova o -whatif para realmente excluir as pastas.

Fonte: Fórum TechNet

    
por 24.06.2014 / 19:54