Usando um arquivo .bat para extrair uma string de um arquivo de texto dentro de uma pasta zip

0

Então, por favor, tenha paciência comigo. Este é apenas o segundo arquivo de lote que eu já escrevi e meu primeiro post em qualquer lugar no StackExchange.

Estou escrevendo um arquivo em lote que informa a um servidor remoto para executar o HP Array Diagnostic Utility e puxar o relatório de volta para o meu computador. Estou extremamente animado porque está funcionando muito bem, na maior parte. Eu tenho um problema menor, no entanto. Eu estou tentando puxar o número de série do arquivo de texto dentro da pasta zip que vem do servidor remoto. Quando eu puxo as informações de um arquivo de texto de teste não dentro de uma pasta compactada, essa parte do código funciona. Não funciona quando o arquivo de texto está na pasta zip, no entanto. Existe uma maneira de fazer isso funcionar?

Aqui está a parte do código em questão:

FOR /f "tokens=1-4 delims= " %%A IN ("%userprofile%\Desktop\report.zip\report.txt") DO (
 IF %%A ==Chassis (
    SET "sn=%%D"
    ECHO %sn%
 )
)

Obrigado.

    
por duzzy 29.06.2014 / 17:36

1 resposta

0

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

Leitura adicional

por 26.07.2014 / 16:36