DEV Community

1

Fazendo download de arquivos

Em alguns momentos, pode ser preciso que nosso script faça o download de algum componente ou arquivo, como um executável atualizado.
Mas será que podemos fazer isso com Powershell?

Sim, conseguimos fazer, e pode ser uma solução bem interessante para manter um script de instalação sempre atualizado. Claro que dependemos que a URL esteja atualizada, mas é interessante sabermos como fazer isso.

Para exemplificar, vamos pegar um ZIP do repositório que mantenho os exemplos que uso nos textos publicados nesse blog e depois vamos descompactar os arquivos. Nesse exemplo vamos simular um pouco do processo que uma ferramenta GIT faria para receber o ambiente e tornar ele disponível localmente.

Para fazermos o download, utilizaremos a função Invoke-WebRequest, informando a URL e o arquivo de saída que queremos.

Para deixar mais organizado, seguindo com essa ideia de simular uma ferramenta de GIT, vamos:

  1. Criar uma pasta na raiz do sistema chamada MyGIT
  2. Fazer o download no APP data
  3. Descompactar os arquivos na pasta que criamos
  4. Limpar nosso download

Para fazermos o processo de descompactar, utilizaremos a função Expand-Archive, passando como parâmetro o local do arquivo e onde queremos deixar o arquivo descompactado.

Como isso fica em código?

# Configuracoes
$urlDownload = "https://github.com/IGDEXE/MLSA-Powershell/archive/main.zip"
$pastaMyGIT = "C:\MyGIT"
$arquivoDownload = "$env:LOCALAPPDATA/GIT.zip"
# Funcao para criar pastas
function Validar-Pasta {
param (
# Aqui definimos qual a posicao e se é obrigatorio ou nao o parametro
# O contador de posicoes comeca em 0, é importante lembrar disso
[parameter(position=0,Mandatory=$True)]
$caminhoPasta
)
# Validamos se o caminho existe, salvando a resposta em uma variavel
$pastaValidacao = Test-Path -Path "$caminhoPasta"
# Se ela já existe, exibimos uma mensagem de erro
if ($pastaValidacao) {
# Recebendo o nome da pasta com base no caminho
$infoPasta = Get-ItemProperty $caminhoPasta
$nomePasta = $infoPasta.Name
# Informamos que a pasta já existe
Write-Host "Já existe o diretorio: $nomePasta"
}
# Se a pasta existe, executamos o bloco de codigo
else {
# Executar o comando de criação de pasta
$esconderRetorno = New-Item -Path "$caminhoPasta" -ItemType "Directory" # Vamos jogar isso numa variavel para nao aparecer o retorno padrao na tela
# Recebendo o nome da pasta com base no caminho
$infoPasta = Get-ItemProperty $caminhoPasta
$nomePasta = $infoPasta.Name
# Mostrar mensagem de confirmação na tela
Write-Host "Criado diretorio: $nomePasta"
}
}
# Para limpar a tela
Clear-Host
try {
# Cria a pasta na raiz do sistema
Validar-Pasta $pastaMyGIT
# Faz o download do arquivo
Write-Host "Fazendo o download"
Invoke-WebRequest -Uri "$urlDownload" -OutFile "$arquivoDownload"
# Descompacta para a pasta que criamos
Write-Host "Descompactando.."
Expand-Archive -Path "$arquivoDownload" -DestinationPath "$pastaMyGIT" -Force
# Limpa a instalacao
Write-Host "Otimizando armazenamento.."
Remove-Item -Path "$arquivoDownload" -Force
# Conclui o processo
Write-Host "Configuração concluida"
Write-Host "Disponivel em: $pastaMyGIT"
}
catch {
$ErrorMessage = $_.Exception.Message # Recebe o erro
Write-Host "Ocorreu um problema" # Mostra a mensagem
Write-Host "Erro: $ErrorMessage"
}
view raw MyGIT.ps1 hosted with ❤ by GitHub

Com isso podemos de forma funcional simular esse comportamento de fazer o download das pastas e organizar os arquivos. Claro que não é o único uso, como exemplo vou deixar um script que escrevi para o download e configuração de uma ferramenta:

# Fazer download e configurar a API do Veracode para C#
# Ivo Dias
# Configuracoes
$urlDownloadAPI = "https://tools.veracode.com/integrations/API-Wrappers/C%23/bin/VeracodeC%23API.zip"
Clear-Host
try {
# Faz o download
Write-Host "Fazendo o download da ferramenta"
Invoke-WebRequest -Uri "$urlDownloadAPI" -OutFile "$env:LOCALAPPDATA/VeracodeAPI.zip"
# Descompacta o arquivo
Write-Host "Descompactando.."
Expand-Archive -Path "$env:LOCALAPPDATA/VeracodeAPI.zip" -DestinationPath "$Env:Programfiles/Veracode/API/.NET"
# Altera o nome do arquivo
Rename-Item -Path "$Env:Programfiles/Veracode/API/.NET/VeracodeC#API.exe" -NewName "$Env:Programfiles/Veracode/API/.NET/VeracodeAPI.exe"
# Adiciona o EXE ao caminho do Path do sistema
Write-Host "Adicionando ao Path do sistema"
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";$Env:Programfiles/Veracode/API/.NET")
Write-Host "Procedimento de configuracao concluido"
}
catch {
$ErrorMessage = $_.Exception.Message # Recebe o erro
Write-Host "Erro ao fazer a configuracao da API"
Write-Host "$ErrorMessage"
}

Com isso podemos tornar nossos scripts mais independentes e minimizando a necessidade de manutenção. Caso tenhamos uma URL sempre atualizada pelo fornecedor, o script não vai precisar de nenhuma alteração para continuar funcionando.

Quadratic AI

Quadratic AI – The Spreadsheet with AI, Code, and Connections

  • AI-Powered Insights: Ask questions in plain English and get instant visualizations
  • Multi-Language Support: Seamlessly switch between Python, SQL, and JavaScript in one workspace
  • Zero Setup Required: Connect to databases or drag-and-drop files straight from your browser
  • Live Collaboration: Work together in real-time, no matter where your team is located
  • Beyond Formulas: Tackle complex analysis that traditional spreadsheets can't handle

Get started for free.

Watch The Demo 📊✨

Top comments (0)

AWS Q Developer image

Your AI Code Assistant

Generate and update README files, create data-flow diagrams, and keep your project fully documented. Built to handle large projects, Amazon Q Developer works alongside you from idea to production code.

Get started free in your IDE

👋 Kindness is contagious

If you found this post helpful, please leave a ❤️ or a friendly comment below!

Okay