Arquivo em lote para criar um arquivo .7z para cada arquivo (na pasta / subpasta) em um novo destino (estrutura de pastas / subpastas)

1

Eu uso um arquivo de lote para fazer backup de arquivos em arquivos 7-Zip. Ele cria um arquivo para cada arquivo separadamente na pasta onde está o arquivo original. Trabalha com subpastas.

FOR /r %%i IN (*.*) DO ( "c:\program files-zipz.exe" a "%%~i.7z" "%%i" -p"%variable%" -t7z -mx0 -mhe -mmt )

Então clonei a árvore de diretórios original (sem arquivos copiados aqui) com XXCopy para um novo destino.

XXCopy "%DirectorySource%" "%DirectoryDestination%" /T /ED5 /Q3 /YY

Em seguida, movo todos os arquivos 7z para a estrutura de diretórios clonada acima.

XXCopy "%DirectorySource%\*.7z" "%DirectoryDestination%" /S /ED /RC /YY /Q3

Isso funciona perfeitamente, embora eu queira criar os arquivos 7z diretamente na estrutura de diretórios clonada. Nenhum arquivo a ser criado ou modificado no local de origem.

Obrigado!

    
por user3703618 18.08.2015 / 17:10

1 resposta

2

AutoHotKey para o resgate! Limitar-se à linha de comando do Windows é doloroso. Já que você mencionou que pretende fazer esse loop junto com o AutoHotKey, por que não apenas usar o AutoHotKey para a coisa toda?

Use StrLen e SubStr para extrair a parte variável do caminho do arquivo. O loop de arquivo irá recorrer a todos os arquivos desejados. E então é só uma questão de usar o RunWait para passar os caminhos que você gerou para o 7-Zip. O ,, Hide especificado no final do RunWait diz para ocultar as janelas de comando geradas.

Veja um script de exemplo que inclui a capacidade de escolher pastas de origem e de destino por meio da GUI:

InputBox, password, Enter Password for Archives, The generated archives will be protected with the password you enter below. Your input will be masked., hide
; Using FileSelectFolder is just one way of choosing your folders.
FileSelectFolder, sourcepath,,, Source Folder
sourcepath := RegExReplace(sourcepath, "\$")  ; Removes the trailing backslash, if present.
FileSelectFolder, destinationpath,,, Destination Folder
destinationpath := RegExReplace(destinationpath, "\$")  ; Removes the trailing backslash, if present.

; This is the meat of the answer:
sourcelen := StrLen(sourcepath) + 1    ; Determine the start of the variable part of the path.
Loop, Files, %sourcepath%\*.*, R       ; Here's the replacement for your batch file loop.
{
    varfilepath := SubStr(A_LoopFileFullPath, sourcelen) ; Grab everything to the right of the source folder.
    RunWait, "c:\program files-zipz.exe" a "%destinationpath%%varfilepath%.7z" "%A_LoopFileFullPath%" -p"%password%" -t7z -mx0 -mhe -mmt,, Hide
    FileCount := a_index
}
Msgbox Archives Created: %FileCount%'nSource: %sourcepath%'nDestination: %destinationpath%

Note que você precisa de v1.1.21 + de AHK ou acima para o loop de arquivo operar como escrito.

    
por 19.08.2015 / 19:41