Seguindo com os tutoriais para iniciantes em Powershell, recomendo a leitura do anterior pois vamos seguir dele, vamos conversar um pouco sobre o tratamento de erros. Existem varias formas de fazer isso, mas como o foco são os principiantes vamos sempre pensar na abordagem com um bom custo beneficio entre a entrega e a curva de aprendizagem.
Para tratarmos erros, vamos usar a estrutura Try-Catch, ela funciona de uma forma bem simples.
Vamos criar dois blocos, o TRY onde colocamos o que queremos fazer e o CATCH, onde colocamos a mensagem de erro que queremos mostrar, no caso de algum procedimento descrito no bloco anterior falhar.
Para exemplificar ele, vamos continuar com o nosso jeito difícil de validar caminhos. A ideia que aplicaremos aqui, é no caso de qualquer problema, retornarmos uma mensagem de erro.
Traduzindo isso para código, teremos:
# Limpamos a tela para facilitar a visualização | |
Clear-Host | |
# Receber o local e armazenar em uma variável chamada Local | |
$Local = Read-Host "Informe o local onde quer criar a pasta" | |
# Receber o nome da pasta e armazenar na variável nomePasta | |
$nomePasta = Read-Host "Informe um nome para a pasta" | |
try { | |
# Vamos começar com as validações | |
$listaPastas = Get-ChildItem -Path $Local -Directory # Recebemos todas as pastas dentro de um caminho, junto com todas as informações dela | |
# Como podemos ter varias pastas, teremos que criar um loop, verificando item a item de nossa lista | |
foreach ($pasta in $listaPastas) { | |
$pasta = $pasta.name # Como queremos validar apenas o nome da pasta, utilizaremos apenas a propriedade NAME | |
# Para compararmos valores, utilizamos o parametro -eq | |
if ($nomePasta -eq $pasta) { | |
$pastaValidacao = "Existe" # Se encontrarmos uma pasta com o mesmo nome, atribuimos o valor Existe para nossa variavel de validacao | |
} | |
} | |
} | |
catch { | |
# Recebemos a mensagem de erro e armazenamos em uma variavel | |
$mensagemErro = $_.Exception.Message | |
# Limpamos a tela e exibimos a mensagem de erro | |
Clear-Host | |
Write-Host "Erro ao tentar criar a pasta $nomePasta" | |
Write-Host "$mensagemErro" | |
} | |
# Se ela já existe, exibimos uma mensagem de erro | |
if ($pastaValidacao -eq "Existe") { | |
# Informamos que a pasta já existe | |
Clear-Host # Limpamos a tela para deixar mais bonito | |
Write-Host "A pasta $nomePasta já existe no caminho $Local" | |
} | |
# Se a pasta nao existe, executamos o bloco de codigo | |
else { | |
# Executar o comando de criação de pasta | |
New-Item -Path "$Local/$nomePasta" -ItemType "Directory" | |
# Mostrar mensagem de confirmação na tela | |
Clear-Host # Limpamos a tela para deixar mais bonito | |
Write-Host "A pasta $nomePasta foi criada em $Local" | |
} |
Nossa validação de erros está funcionando, como podemos ver nesse retorno quando informei um caminho que não existia:
Mas caso tenha apenas executado nosso script, provavelmente não viu essa mensagem, uma vez que não estamos dando qualquer tratamento a continuidade do script caso tenhamos problemas.
Existem algumas formas de sairmos disso, mas utilizaremos aqui a mais simples e frustrante possível para o usuário.
Vamos apenas quebrar o script depois de que mostrarmos o erro.
Faremos isso por meio do combo PAUSE + EXIT, com o primeiro comando vamos pausar a tela para que seja possível ler o que está escrito, e com o segundo iremos fechar o prompt.
Essa abordagem não é a melhor, mas aproveitaremos esse momento para conhecer esses dois comandos e essa possibilidade, já que em alguns momentos, fara sentido pausar ou apenas encerrar tudo.
Adicionaremos o combo em nosso catch, que terminará dessa forma:
# Limpamos a tela para facilitar a visualização | |
Clear-Host | |
# Receber o local e armazenar em uma variável chamada Local | |
$Local = Read-Host "Informe o local onde quer criar a pasta" | |
# Receber o nome da pasta e armazenar na variável nomePasta | |
$nomePasta = Read-Host "Informe um nome para a pasta" | |
try { | |
# Vamos começar com as validações | |
$listaPastas = Get-ChildItem -Path $Local -Directory # Recebemos todas as pastas dentro de um caminho, junto com todas as informações dela | |
# Como podemos ter varias pastas, teremos que criar um loop, verificando item a item de nossa lista | |
foreach ($pasta in $listaPastas) { | |
$pasta = $pasta.name # Como queremos validar apenas o nome da pasta, utilizaremos apenas a propriedade NAME | |
# Para compararmos valores, utilizamos o parametro -eq | |
if ($nomePasta -eq $pasta) { | |
$pastaValidacao = "Existe" # Se encontrarmos uma pasta com o mesmo nome, atribuimos o valor Existe para nossa variavel de validacao | |
} | |
} | |
} | |
catch { | |
# Recebemos a mensagem de erro e armazenamos em uma variavel | |
$mensagemErro = $_.Exception.Message | |
# Limpamos a tela e exibimos a mensagem de erro | |
Clear-Host | |
Write-Host "Erro ao tentar criar a pasta $nomePasta" | |
Write-Host "$mensagemErro" | |
Pause # Utilizamos isso para aguardarmos um retorno do usuario | |
Exit # Encerramos o terminal | |
} | |
# Se ela já existe, exibimos uma mensagem de erro | |
if ($pastaValidacao -eq "Existe") { | |
# Informamos que a pasta já existe | |
Clear-Host # Limpamos a tela para deixar mais bonito | |
Write-Host "A pasta $nomePasta já existe no caminho $Local" | |
} | |
# Se a pasta nao existe, executamos o bloco de codigo | |
else { | |
# Executar o comando de criação de pasta | |
New-Item -Path "$Local/$nomePasta" -ItemType "Directory" | |
# Mostrar mensagem de confirmação na tela | |
Clear-Host # Limpamos a tela para deixar mais bonito | |
Write-Host "A pasta $nomePasta foi criada em $Local" | |
} |
Como retorno, teremos a mensagem:
E assim que apertarmos enter, o terminal será encerrado.
Temos alguns pontos de atenção sobre o que vimos hoje, o primeiro está relacionado ao idioma da mensagem, ele vai variar conforme a do sistema. O idioma do sistema será o idioma do retorno do erro.
O outro ponto, é a mensagem de erro em si, que para essa situação acabou não sendo muito clara, informando apenas que não conseguiu localizar algo com o atributo Diretório.
É possível tratar essas mensagens, mas o objetivo aqui não é se aprofundar tanto sobre cada componente, por isso recomendo que pesquise mais sobre como implementar o Try-Catch no Powershell.
Top comments (0)