Usando um arquivo em lotes para compactar arquivos como arquivos zip individuais


10

Então, eu estou tentando usar 7zip em um arquivo em lotes para pegar os arquivos em uma pasta e compactá-los como arquivos individuais. Portanto, o primeiro arquivo obtém seu próprio arquivo zip, e o próximo e assim por diante. Estive procurando na internet e tentei vários códigos diferentes. Até agora, só consegui compactá-los como um único arquivo zip e gerá-los na minha área de trabalho.

Infelizmente, perdi o código que fez isso e agora estou preso a isso que parece não 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

Quero que cada arquivo tenha seu próprio arquivo zip e, para que ele compartilhe o nome do arquivo, menos a extensão, é claro.

Qualquer ajuda é muito apreciada.


Além disso, se houver uma maneira mais fácil de fazer isso usando o recurso zip embutido no Windows 10, isso também seria bom.
Mike Van Dunk

Respostas:


4

Quero que cada arquivo tenha seu próprio arquivo zip e, para que ele compartilhe o nome do arquivo, menos a extensão, é claro.

Script de lote

(Defina os caminhos completos das pastas explícitas de origem e destino no topo e execute-os conforme necessário. A origem é onde estão os arquivos que você deseja compactar e o destino é onde você deseja que eles sejam compactados.)

@ECHO ON

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

CD /D "C:\Program Files\7-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"

Recursos adicionais


4

Seu script original faz o seguinte, linha por linha:

@echo on

Informa ao prompt de comando para imprimir de volta cada comando no arquivo em lotes antes de executá-los. Isso é apenas para que você possa "ver" o que realmente está fazendo antes de fazê-lo.

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

C Hanges D irectory no que eu espero é o caminho onde você deseja zip de todos os arquivos.

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

O parâmetro para o INaqui é (C:\Users\MVD21\Desktop\test). Isso fará com que o loop "body" (a ação por trás da palavra-chave DO) seja executado exatamente uma vez , com o %iparâmetro 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 compactaria o diretório inteiro em um único arquivo .7z.

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

pause

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


Ao criar um script em lote (ou, na verdade, qualquer outra coisa que lida com código), você deve parar de tratar o script inteiro como uma cópia-colagem monolítica que você não entende (tenta entender) e, em vez disso, divide sua problema em sub-partes que você pode descobrir individualmente e depois conectá-las. Isso permitirá que você resolva problemas de forma independente e crie soluções em vez de solicitar que outra pessoa faça todo o seu trabalho por você. Eu recomendo.

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

  1. Itere (faça um loop) cada arquivo contido em um determinado diretório.
  2. Para cada arquivo fornecido, coloque-o em um arquivo .7z chamando o 7zutilitário.

As chances de alguém já ter uma resposta lá fora que resolve sua necessidade específica são menores do 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 ponto principal da resposta é que você apenas começa com esta parte da resposta StackOverflow:

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

e mude a parte em que está fazendo algo (o echo %%f) para fazer o que você quer fazer . Eu sei que você precisa alterar essa parte, porque analisei o texto do script e entendi o que cada caractere e parâmetro significam, para que eu possa raciocinar sobre onde 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 one pauseacima são boas práticas, portanto você pode deixá-las dentro. E provavelmente você também deseja manter essa cddeclaração, se seus 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 O ajudarei. Se você tentar isso e não funcionar, você DEVE me dizer nos comentários as seguintes informações:

  • Que mensagem de erro exata você recebe no prompt de comando quando executa esses comandos ou os coloca em um arquivo em lotes e os executa? Não abrevie; copie e cole a saída diretamente (coloque-o em http://pastebin.com, se houver 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 PATHvariável de ambiente? (verifique isso, como mencionado acima, com echo %PATH%um cmdprompt.)

Eu não acho que isso esteja funcionando porque eu tenho o 7zip instalado em outra unidade? Parece funcionar se eu fizer o CD "Location of 7zip" como na resposta original. Claro que isso só funciona "algumas vezes". Estava funcionando até eu colocar outra declaração de eco nela e agora não está. E sim, estou tentando entender mais sobre arquivos em lote. Eu tenho tentado encontrar um glossário de comandos em lote ou o que não estudar, então eu realmente entendo. Confie em mim, eu prefiro entender E fazê-lo funcionar do que apenas fazê-lo funcionar.
Mike Van Dunk

Eu tentei sua solução e não posso dizer qual é a saída, porque o arquivo em lotes não é executado. Ele abre brevemente com a janela do cmd piscando e depois fecha novamente. Sim, eu tenho uma pausa lá. Eu tenho 7zip instalado em ambos minha unidade local e em uma unidade interna secundária, mas não parecem ser parte do ambiente do caminho
Mike Van Dunk

Eu realmente gostaria de entender, mas pesquisar no Google não está ajudando muito. Por exemplo, não tenho idéia do que é esse comando ou parâmetro "'dir / b" ou o que está fazendo. Eu sei que dir obviamente é um diretório, mas não sei o que é o / b. O que eu gostaria é que alguém explique o que os parâmetros estão fazendo para que eu possa entender melhor. Ou se alguém tiver um link para um site no qual repasse esse tipo de coisa que também seria útil. Pesquisei 'dir / b em um arquivo em lotes e não consegui encontrar nada. Eu acho que o / b tem algo a ver com os nomes dos arquivos, mas não tenho certeza.
Mike Van Dunk
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.