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.

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay