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:
- Iterar (loopar) cada arquivo contido em um determinado diretório.
- 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
).