DEV Community

1

Trabalhando com informações do sistema

Seguindo com o nosso post anterior, vamos agora antes de criar a pasta, validar se ela já não existe no sistema para evitar duplicações e erros.

Para fazer isso precisamos receber informações do sistema e valida-las, sendo mais especifico, precisamos saber quais pastas existem e verificar se a que queremos criar está entre elas. Esse cenário é muito comum, quando temos um script que ira continuamente ser executado ou se queremos validar uma instalação.

Em nosso script, vamos adicionar antes da criação da pasta, uma etapa de validação onde utilizaremos uma função do Powershell chamada Test-Path, ou se traduzirmos Testar-Caminho.
Com essa função, informando um caminho, validamos se o mesmo existe ou não.

Notamos o como ela é especifica e muito simples de usar, gostaria de aproveitar esse momento para compartilhar algo sobre a linguagem. Costumo dizer que sempre que pensamos em algo que muitas pessoas utilizariam e que faz sentido, é muito provável que já tenhamos uma função pronta para esse procedimento, valendo sempre muito a pena pesquisar sobre antes de tentar criar manualmente algo que faça o mesmo procedimento.

Fora a função, precisamos tratar o seu retorno, uma vez que com ela apenas saberemos se o caminho existe ou não, por meio do retorno True(verdadeiro) ou False(falso).
Para isso, vamos usar a estrutura IF-ELSE, onde passamos uma parâmetro que queremos validar. Nesse caso, utilizaremos isso de uma forma bem simples, mas conversaremos melhor sobre.

Traduzindo isso em código:

# 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"
# Validamos se o caminho existe, salvando a resposta em uma variavel
$pastaValidacao = Test-Path -Path "$Local/$nomePasta"
# Se ela já existe, exibimos uma mensagem de erro
if ($pastaValidacao) {
# 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 nao pasta 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"
}

Para testar vamos tentar criar a mesma pasta duas vezes, no lado esquerdo temos a primeira tentativa e no direito a segunda.
Retorno Comando
Como podemos ver, nossa validação está funcionando e o sistema não tenta criar uma pasta já existente.

Com essas pequenas adições, conseguimos aprimorar nosso script de criação de pastas e aumentar nosso leque de possibilidades dentro do Powershell. mas será que podemos fazer isso pelo caminho mais longo? Sem utilizar o Test-Path?
E a resposta é sim, embora não recomende.

Como o objetivo aqui é aprender, vamos pensar em como podemos fazer isso, mesmo não fazendo muito sentido, uma vez que aumentaríamos sem precisar a complexidade de nosso código e isso nunca é indicado, já que aumenta as chances de termos problemas.

Vamos pensar um pouco no que nossa função faz:

  1. Recebe um caminho
  2. Verifica quais pastas existem dentro do caminho base
  3. Valida se existe alguma pasta com o mesmo nome da nossa
  4. Retorna verdadeiro ou falso

Para validar esse algoritmo, vamos criar um outro script com esse conceito adicionado a nossa criação de pastas:

# 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"
# 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
}
}
# 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"
}

Não seria possível concluirmos esse modo difícil com o conhecimento que explicamos até aqui, mas futuramente vamos conversar mais sobre Foreach, já que ele vai ser muito útil para nossas automações.

Nosso caminho difícil pode gerar problemas, uma vez que tentando validar se nossa pasta já existe, não estamos trabalhando com um cenário onde nosso caminho não existe.
Será que existe uma forma simples de tratar erros em nosso código?
E a resposta inicial é... TRY-CATCH, ou como gosto de chamar, o próximo tópico que conversaremos nessa serie haha

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

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