Usando um arquivo em lotes para zipar os arquivos como arquivos zip individuais

8

Estou tentando usar o 7zip em um arquivo de lote para pegar os arquivos em uma pasta e compactá-los como arquivos individuais. Assim, o primeiro arquivo obtém seu próprio arquivo zip e o próximo, e assim por diante. Eu tenho procurado na internet e tentei um monte de códigos diferentes. Até agora eu só consegui zip-los com sucesso como um único arquivo zip e enviar para a minha área de trabalho.

Infelizmente eu perdi o código que fez isso, e agora estou preso a isso que não parece fazer nada.

@echo on
cd "C:\Users\MVD21\Desktop\test"
FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"
pause

Eu quero que cada arquivo tenha seu próprio arquivo zip e que o arquivo zip compartilhe o nome do arquivo, menos a extensão do curso.

Qualquer ajuda é muito apreciada.

    
por Mike Van Dunk 14.03.2017 / 00:50

2 respostas

3

I want each file to have it's own zip archive, and for the zip archive to share the name of the file, minus the extension of course.

Script em lote

(Defina os caminhos explícitos cheios da pasta de origem e destino no topo e depois execute conforme necessário. A origem é onde os arquivos existem que você deseja compactar e o destino é onde você deseja que os arquivos sejam compactados.)

@ECHO ON

SET SourceDir=C:\folder\source
SET DestDir=C:\folder\destination

CD /D "C:\Program Files-Zip"
FOR /F "TOKENS=*" %%F IN ('DIR /B /A-D "%SourceDir%"') DO (
    7z.exe a "%DestDir%\%%~NF.zip" "%SourceDir%\%%~NXF"
)
EXIT

Linha de Comando

FOR /F "TOKENS=*" %F IN ('DIR /B /A-D "C:\Folder\Source"') DO 7z.exe a "C:\Folder\Dest\%~NF.zip" "C:\Folder\Source\%~NXF"

Mais recursos

por 14.03.2017 / 01:31
3

Seu script original faz o seguinte, linha por linha:

@echo on

Diz ao prompt de comando para imprimir cada comando no arquivo em lote antes de executá-los. Isso é apenas para que você possa "ver" o que realmente está fazendo antes de fazer isso.

cd "C:\Users\MVD21\Desktop\test"

C trava o diretório D para o que eu espero que seja o caminho onde você quer zipar todos os arquivos.

FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"

O parâmetro para o IN aqui é (C:\Users\MVD21\Desktop\test) . Isso fará com que o loop "body" (a ação por trás da palavra-chave DO ) seja executada exatamente uma vez , com o parâmetro %i atribuído ao valor C:\Users\MVD21\Desktop\test . Não é surpresa que isso não faça o que você quer! Parece que isso ziparia todo o diretório em um único arquivo .7z.

Se não nada , provavelmente é porque não é possível encontrar o caminho de 7z.exe . Se esse arquivo não estiver no diretório atual (no diretório test mencionado acima), ele precisará estar no PATH (na variável de ambiente %PATH% ; tente echo %PATH% em um shell para ver o que está definido para atualmente). Caso contrário, você terá que copiar 7z.exe para o diretório atual ou especificar um caminho absoluto para onde ele está localizado (como, por exemplo, "C:\Program Files-zipz.exe" ... ).

pause

Quando o script é concluído, essa palavra-chave diz ao shell para aguardar que você pressione enter ou feche o prompt de comando em vez de sair imediatamente.

Quando você cria um script em lote (ou, na verdade, qualquer outra coisa que lide com código), você deve parar de tratar o script inteiro como um colar / copiar monolítico que você não entende (tenta) e divida seu problema em sub-partes que você pode descobrir individualmente, então junte-as. Isso permitirá que você resolva problemas de forma independente e crie soluções em vez de pedir a alguém para fazer todo o seu trabalho para você. Eu recomendo strongmente.

No seu caso, você tem os seguintes subcomponentes do seu problema:

  1. Iterar (loopar) cada arquivo contido em um determinado diretório.
  2. Para cada arquivo fornecido, coloque-o em um arquivo .7z chamando o utilitário 7z .

As chances de alguém ter uma resposta lá fora que resolva sua necessidade específica é menor que a chance de encontrar as partes mais gerais individualmente.

Esta pergunta, 'Como fazer algo com cada arquivo em um diretório em um script em lote' resolve metade do seu problema .

O impulso da resposta é que você acabou de começar com essa parte da resposta do StackOverflow:

for /f "usebackq delims=|" %%f in ('dir /b "c:\program files"') do echo %%f

e mude a parte onde está fazendo algo (o echo %%f ) para fazer o que você quer fazer . Eu sei que você precisa mudar essa parte, porque eu analisei o texto do script e entendi o que cada caractere e parâmetro significa, então eu posso argumentar sobre onde eu quero inserir meu próprio código.

Aqui está um "código de ar" (não testado!):

for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~ni.7z" "%i"

As instruções @echo on e pause acima são boas práticas, para que você possa deixá-las. E provavelmente também desejará manter essa instrução cd , se os arquivos estiverem localizados nesse caminho.

Então o que isso nos deixa?

@echo on
cd "C:\Users\MVD21\Desktop\test"
for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~nf.7z" "%f"
pause

Se você responder com "Não funciona!", NÃO irei ajudá-lo. Se você tentar isso e não funcionar, DEVE informar me nos comentários as seguintes informações:

  • Que mensagem de erro exata você recebe no prompt de comando ao executar esses comandos ou colocá-los em um arquivo de lote e executá-los? Não abrevie; copie e cole o resultado diretamente (coloque-o no link se for muito).
  • O que você acha que a mensagem de erro está dizendo que o problema é?
  • Onde está localizada sua instalação do 7-zip (o caminho do arquivo)?
  • O local do arquivo da instalação do 7-zip está incluído no conteúdo da variável de ambiente PATH ? (verifique isso, como mencionado acima, com echo %PATH% em um prompt cmd ).
por 14.03.2017 / 01:30

Tags