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 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 executado exatamente uma vez , com o %i
parâ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 test
diretó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.exe
para 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:
- Itere (faça um loop) cada arquivo contido em um determinado diretório.
- Para cada arquivo fornecido, coloque-o em um arquivo .7z chamando o
7z
utilitá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 on
e pause
acima são boas práticas, portanto você pode deixá-las dentro. E provavelmente você também deseja manter essa cd
declaraçã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
PATH
variável de ambiente? (verifique isso, como mencionado acima, com echo %PATH%
um cmd
prompt.)