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:
- Criar uma pasta na raiz do sistema chamada MyGIT
- Fazer o download no APP data
- Descompactar os arquivos na pasta que criamos
- 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" | |
} |
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.
Top comments (0)