3
respostas

[Dúvida] Como acessar o tar

Estava explorando como criar um script um pouco mais robusto mas me deparei com um problema, aparentemente o comando tar -cf notasficais.zip *.xml dentro do bloco if com delayExpansion não consegue expandir o caracter coringa * resultando em um erro no comando tar, também tentei adicionar uma string vazia set "fileList=" e preencher dentro do for set "fileList=!fileList! "%%a"" para executar junto com o comando tar mas não funcionou poderia me ajudar a entender como executar o que eu tinha planejado por favor?

@echo off
cls
echo Compactando arquivos

setlocal EnableDelayedExpansion
set count=0

for %%a in (*.xml) do (
  set /a count+=1
)

if !count! EQU 0 (
  echo Nenhum arquivo XML encontrado. Compactacao cancelada.
) else (
  echo !count! arquivo(s) XML encontrado(s). Compactando...
  tar -cf notasficais.zip *.xml
  if !errorlevel! EQU 0 (
        echo Arquivos compactados com sucesso!
  ) ELSE (
        echo Erro ao compactar os arquivos.
  )
)

endlocal

pause
3 respostas

Oi Israel!

O problema que você está enfrentando ocorre devido ao comportamento do Delayed Expansion no cmd. O uso de * dentro do for e o comando tar não funcionam como esperado com Delayed Expansion, pois o * precisa ser expandido pelo cmd antes de o comando ser executado, mas o Delayed Expansion está interferindo na expansão dos coringas.

Aqui está uma forma de resolver o seu problema:

  1. Use uma variável para armazenar a lista de arquivos .xml.
  2. Em vez de usar tar -cf notasficais.zip *.xml, você pode concatenar os nomes dos arquivos em uma variável e depois passá-la para o comando tar.

Abaixo está o script ajustado para fazer isso:

@echo off
cls
echo Compactando arquivos

setlocal EnableDelayedExpansion
set count=0
set "fileList="

rem Contar arquivos XML e armazenar os nomes dos arquivos
for %%a in (*.xml) do (
  set /a count+=1
  set "fileList=!fileList! %%a"
)

if !count! EQU 0 (
  echo Nenhum arquivo XML encontrado. Compactacao cancelada.
) else (
  echo !count! arquivo(s) XML encontrado(s). Compactando...
  rem Compactando usando o comando tar
  tar -cf notasficais.zip !fileList!
  if !errorlevel! EQU 0 (
    echo Arquivos compactados com sucesso!
  ) else (
    echo Erro ao compactar os arquivos.
  )
)

endlocal

pause

O que foi alterado:

  1. Variável fileList: Ao invés de tentar expandir diretamente o coringa *, agora você armazena os nomes dos arquivos XML em uma variável fileList durante o loop for.
  2. Uso de !fileList!: A variável fileList é usada na linha onde o tar é executado. Isso permite que o comando tar receba a lista de arquivos corretamente.

Como funciona:

  • O loop for %%a in (*.xml) percorre todos os arquivos .xml no diretório.
  • A variável fileList é construída concatenando o nome de cada arquivo XML.
  • Se houver pelo menos um arquivo XML, o comando tar é executado com a lista de arquivos armazenados em fileList.
  • O comando tar deve funcionar corretamente agora, pois a lista de arquivos foi expandida antes de ser passada para o comando.

Isso deve resolver o problema que você encontrou e permitir que os arquivos sejam compactados corretamente.

Eu já tinha tentando dessa forma e não tinha dado certo tentei novamente copiando e colando e de fato não consegui fazer o comando tar funcionar. Não preciso ficar preso nessa forma de execução só queria exibir um mensagem mais informativa com numero de arquivos XML encontrados para processamento.

Certo. Você pode tentar outras abordagens:

1. Usando forfiles:

A ferramenta forfiles é uma opção mais robusta e confiável para lidar com listas de arquivos em scripts batch, especialmente quando você precisa passar a lista para outro comando.

@echo off
cls
echo Compactando arquivos

setlocal EnableDelayedExpansion
set count=0

for %%a in (*.xml) do (
  set /a count+=1
)

if !count! EQU 0 (
  echo Nenhum arquivo XML encontrado. Compactacao cancelada.
) else (
  echo !count! arquivo(s) XML encontrado(s). Compactando...
  
  forfiles /m *.xml /c "cmd /c echo @file" > filelist.txt
  
  tar -cf notasficais.zip -T filelist.txt
  
  if !errorlevel! EQU 0 (
        echo Arquivos compactados com sucesso!
  ) else (
        echo Erro ao compactar os arquivos.
  )
  
  del filelist.txt
)

endlocal

pause

Explicação:

  • forfiles /m *.xml /c "cmd /c echo @file" > filelist.txt: Essa linha usa forfiles para iterar sobre todos os arquivos .xml. Para cada arquivo, ela executa cmd /c echo @file que imprime o nome do arquivo no console. A saída de todos esses echo são redirecionadas para o arquivo filelist.txt.
  • tar -cf notasficais.zip -T filelist.txt: Aqui, o tar recebe o argumento -T filelist.txt, o que faz ele ler a lista de arquivos para inclusão no zip do arquivo listado no arquivo filelist.txt.
  • del filelist.txt: Remove o arquivo temporário após o uso.

2. Usando o 7-Zip:

O 7-Zip é uma ferramenta de compactação gratuita e simples para manipular listas de arquivos.

Para usar essa abordagem, você precisaria ter o 7-Zip instalado e o caminho do executável 7z.exe dentro da variável de ambiente PATH ou você pode especificar o caminho completo dele no script.

@echo off
cls
echo Compactando arquivos

setlocal EnableDelayedExpansion
set count=0

for %%a in (*.xml) do (
  set /a count+=1
)

if !count! EQU 0 (
  echo Nenhum arquivo XML encontrado. Compactacao cancelada.
) else (
  echo !count! arquivo(s) XML encontrado(s). Compactando...
    
  "C:\Program Files\7-Zip\7z.exe" a notasficais.zip *.xml
    
  if !errorlevel! EQU 0 (
    echo Arquivos compactados com sucesso!
  ) else (
    echo Erro ao compactar os arquivos.
  )
)

endlocal

pause

Observações:

  • Você precisará adaptar o caminho para o 7z.exe se ele estiver em um diretório diferente.
  • A opção "a" no 7z é usada para adicionar arquivos a um arquivo zip.

Espero que isso ajude! Se tiver mais dúvidas, é só perguntar.