Solução
Apesar do fato de o Windows exibir .zip
archives como pastas compactadas, elas não são pastas reais . Isso significa que você não pode acessar diretamente o conteúdo compactado até que você o extraia em algum lugar.
O Windows não fornece um utilitário de linha de comando para extrair (ou criar, no caso) arquivos compactados. Com um pequeno VBScript, você pode ignorar essa limitação:
REM^ &@echo off
REM^ &if not exist "%~f1" exit /b 2
REM^ &md "%temp%\%~nx1" 2>nul
REM^ &cscript /nologo /e:vbscript "%~f0" "%~f1" "%temp%\%~nx1"
REM^ &exit /b
Set sa = CreateObject("Shell.Application")
Set files = sa.NameSpace(WScript.Arguments(0)).Items
Set target = sa.NameSpace(WScript.Arguments(1))
For Each file In files
target.CopyHere file, 1556
Next
Como funciona
O script acima é híbrido (graças a dbenham e jeb pela idéia) e contém comandos regulares em lote e VBScript em um único arquivo.
O script aceita apenas um parâmetro, que é o caminho do arquivo. No início, o script verifica se o arquivo especificado realmente existe e, em seguida, continua criando uma subpasta com o nome do arquivo morto na pasta temporária incorporada.
O código VBScript é então executado. Cada arquivo no arquivo é copiado (extraído) para a pasta de destino. O valor da opção é 1556
, que corresponde a 4 + 16 + 512 + 1024
e é necessário para tornar toda a operação desatendida ignorando os prompts de confirmação (consulte o link abaixo para obter detalhes adicionais).
Exemplo de uso
@echo off
setlocal
set archive=report.zip
call UnzipHelper.cmd "%userprofile%\Desktop\%archive%" >nul
pushd "%temp%\%archive%"
REM your code here
popd
rd /s /q "%temp%\%archive%" 2>nul
pause
endlocal & exit /b