7-Zip CMD: adicione a data atual para arquivar e inclua apenas a última pasta modificada no arquivo morto

6

Estou tentando criar um script de backup com 7-Zip . Eu já fiz tudo mais, mas essas duas questões ainda estão me bloqueando.

Primeiramente, quero adicionar um registro de data e hora com uma data de criação como esta: 3.11.2010 Backup.7z

Então, o formato dd.mm.yyyy . Eu tentei várias versões que encontrei no Internnet, mas nenhuma delas funcionaria do jeito que eu queria. O que devo fazer?

Em segundo lugar, eu só quero adicionar a última pasta modificada ao arquivo (não importa quantas pastas existem no diretório; eu só preciso do mais recente). Basicamente, eu tenho algo assim:

App_v.1.0.0.4.exe_Url_2um2yok5q4vpoxnvnscpq3adfwff4wsmi
App_v.1.0.0.5.exe_Url_ft4mnvbu54hfrgdhxrahj4imlmermdsoe

Por isso, quero adicionar apenas a pasta mais recente (1.0.0.5). Essas pastas mudam e sempre têm nomes diferentes, então a classificação baseada em nome seria uma má ideia.

    
por TMRW 03.11.2010 / 21:59

4 respostas

6
7z a -r "%DATE:~7,2%.%DATE:~4,2%.%DATE:~-4% Backup".7z

Irá criar o arquivo com o formato DD.MM.YYYY Backup.7z .

Explicação: O eco de %DATE% imprime a data em sua configuração de formato de data regional.

D:\>echo %DATE%
Thu 11/04/2010

Usando ~x,y specifier, você está fazendo uma extração em string / substring da string - onde x é o caractere inicial e y do número de caracteres que você deseja extrair.

Em seu segundo ponto:

I only want to add last modified folder to archive(no matter how many folders exist in directory I just need the latest).

7z u -r "%DATE:~2,2%.%DATE:~5,2%.%DATE:~-4% Backup".7z 

deve fazer isso.

    
por 04.11.2010 / 16:57
1

Você pode usar "instrumentação de gerenciamento do Windows". Veja este

test1.bat :

set mydate=
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined mydate set mydate=%%x
echo Current date is %mydate%

Resultado:

Current date is 20140202145547.557000+060

Independentemente das suas "configurações regionais" (formato de data) em "Painel de Controle", ele sempre retorna AAAAMMDD.

    
por 02.02.2014 / 15:18
0

A linha de comando do 7zip não terá a lógica para executar as tarefas de que você precisa. Se você estiver executando o Linux, você terá que descobrir como fazer isso no seu script de shell. Se você está no Windows, pode experimentar a linguagem batch em DOS (que PODERÁ ser poderosa o suficiente), powershell (que requer que você instale algo), ou escreva um arquivo vbscript (.vbs) que deve ser uma boa solução.

Se você decidir seguir a rota vbs, recomendo que você procure usar o objeto filesystem com vbscript. link

    
por 04.11.2010 / 00:25
0

O que eu fiz para obter arquivos que foram alterados naquele dia foi usar o Robocopy para copiar os arquivos recém-modificados para um diretório temporário e depois 7zip.

EDIT:
Desde o início quero dizer que não sou ninja em lote, mas através da leitura de sites eu consegui reunir algo que parece funcionar bem o suficiente. Eu não sou um programador, mas eu sou o "cara do computador", então eu sei mais do que a maioria com quem trabalho.

Aqui está o script I usado. O formato de data é diferente do que você pediu, escolha YYYY-MM-DD porque as coisas seriam classificadas bem no Windows Explorer. Você deve ser capaz de mudar isso para como você quer que as coisas sejam rotuladas.

A parte / maxage: 1 do script é o que limita as coisas que mudaram em um dia. Eu corro o script de backup diariamente.

Um problema que eu não tinha corrigido no script é que, se nenhum arquivo foi alterado, um arquivo 7z de 32k de tamanho ainda é criado (um arquivo 7z vazio). Eu tinha planejado adicionar a detecção de diretório vazia, ou se nada mais fizesse um hash e comparasse a um hash de arquivo 7z vazio e, se a correspondência, excluísse o arquivo 7z vazio recém-criado.

No meu script de backup completo, eu tenho o script hash o arquivo para que eu possa comparar manualmente os hashes dos dois últimos backups completos para ver se eles são os mesmos. (Ter um script como esse não detectará se os arquivos foram excluídos porque os backups incrementais não exibirão nenhum arquivo adicionado.) Se o hash atual e o hash anterior forem os mesmos, excluo o backup mais recente porque nada foi alterado desde então. (Eu planejei automatizar está verificando se eu tinha tempo).

Espero limpar o script (removendo nomes de servidores e assim por diante) Eu não o quebrei, e nunca tive muito tempo para aperfeiçoar o script, então é grosseiro. De qualquer forma, espero que seja bom o suficiente para começar a seguir a direção certa para um script que atenda às suas necessidades.

Se você precisar de algum esclarecimento sobre os switches ou porque eu escolhi os switches que fiz, fique à vontade para perguntar.

rem Setup Variables...
set zcmd="c:\program files-zipz" a -t7z -r -mx=7 -ssw -mtc=on
set backupdir=C:\_backupsburn
set tempdir=C:\_backups\temp
rem date format YYYY_MM_DD
set mydate=%date:~10,4%_%date:~4,2%_%date:~7,2%
set rc=c:\robocopy.exe

rem Make Directories...
md %backupdir%\%mydate%
if exist %tempdir% rd %tempdir% /s /q
if not exist %tempdir% md %tempdir%

rem Copy changed files...
%rc% \server1\source\path %tempdir%\temp\path *.* /s /z /copy:dat /maxage:1 /r:5 /w:5     /log:%backupdir%\%mydate%\log.txt /np

rem Compress changed files...
if exist %tempdir%\temp\path %zcmd% %backupdir%\%mydate%\backup1.7z %tempdir%\temp\path\*.*

rem Remove temp directory...
rd %tempdir%\temp\path\ /q /s

rem copy compressed file and log to offsite server...
%rc% /copy:dat /e /z /r:5 /w:5 %backupdir%\%mydate%  "\remote_server\share\backup_path\%mydate%"


rem email changed files log from offsite server...
rem C:\blat\blat262\full\blat -subject "BATCH: backup1 inc backup for %mydate%." -bodyf "\remote_server\share\backup_path\%mydate%\log.txt" -server \mailserver -f AccountToSendTo -tf c:\ListOfAdmins2Email.txt -u Username -pw Pa$$w0rd
    
por 04.11.2010 / 01:14