Comprimir uma pasta periodicamente

3

Eu preciso compactar uma pasta específica no Windows por hora e movê-la para uma pasta de destino diferente. Como posso fazer isso?

    
por 3498DB 11.12.2009 / 08:01

4 respostas

4

Eu tenho um script em lote que faz algo semelhante para empacotar versões do jogo em que estou trabalhando. Eu o adaptei e você provavelmente pode usar algo semelhante ao seguinte:

@echo off
cd folder
zip -9 -r Filename.zip *
echo Done.

Os zip switches:

  • -9 tenta a melhor compactação
  • -r causa recursão de diretório

Se você precisar copiar recursos, ou uma árvore de pastas, por exemplo (como eu precisei fazer), você pode usar o xcopy para efetuar isso.

echo Copying resources to Release dir...
xcopy resources bin\Release\Resources /Y /E /I

As várias linhas de comando são alteradas aqui:

  • causa sobrescrita automática de arquivos existentes ( /Y )
  • copie todas as pastas, incluindo as vazias ( /E )
  • basicamente permite copiar árvores de diretórios ( /I )

Espero que isso forneça informações suficientes para que você possa configurar o script em lote. Então, como os outros disseram, você pode usar tarefas agendadas para fazer com que o script seja executado de hora em hora. Se você não tem a linha de comando zip, eu uso este . Copie-o para C:\Windows\System32 e ele deverá estar acessível em todos os scripts em lote.

Atualizar

Para adequar seu comentário adicional sobre como nomear o zip com o timestamp atual, proponho a seguinte solução: Adicione as seguintes linhas ao final do script em lote que você definiu para ser executado por hora.

set timestamp=%date:~10,4%%date:~7,2%%date:~4,2%%time:~0,2%%time:~3,2%%time:~6,2%
ren OldZipFileName.zip %timestamp%.zip

Isso renomeará o arquivo zip antigo para o novo, com o formato YYYYMMDDHHmmSS; isto é, ano-mês-dia-hora-minuto-segundo. Se você deseja adicionar um prefixo ou sufixo ao nome do arquivo, faça isso antes ou depois da seção %timestamp% , por exemplo:

ren OldZipFileName.zip build_%timestamp%_debug.zip

Atualizar novamente

O motivo da grande e difícil linha set timestamp=... é que os formatos padrão de %date% e %time% não são os melhores para o que queremos fazer. Se nós os fizermos eco ao console para ver como eles são normalmente, teremos algo parecido com isso:

> echo %date%
Sun 13/12/2009
> echo %time%
 2:53:31.60

Então, usamos a função de substring de fantasia de variáveis em lote, assim: %variablename:~startindex,length% . Como você pode ver acima, você precisará repeti-lo uma vez para cada segmento que deseja copiar. Então, no meu caso, para obter o nome do arquivo de saída no formato AAAAMMDDHHMMSS, eu precisava copiar três partes de cada uma das variáveis %date% e %time% , usando a substring. Junte todas essas partes e você terá a longa lista que escrevi lá antes. Para dar um exemplo dessas partes individualmente:

> echo %date%
Sun 13/12/2009
> echo %date:~10,4%
2009
> echo %date:~7,2%
12

Espero que isso ajude a esclarecer as coisas para você!

    
por 11.12.2009 / 08:39
1

Estou longe do Windows, mas aqui está uma idéia genérica: mantenha um registro do tempo decorrido no programa e, a cada 3600, use as chamadas e primitivos específicos da biblioteca de compactação para fazer o que deseja.

    
por 11.12.2009 / 08:03
1

Escreva um arquivo em lotes que faça a compactação e a cópia. Em seguida, configure Tarefas agendadas para executá-lo a cada hora.

    
por 11.12.2009 / 08:04
1

Você provavelmente deseja usar o Agendador de tarefas . No Vista e 7 você chega digitando taskschd.msc na caixa de diálogo Executar.

    
por 11.12.2009 / 08:05

Tags