Validação de Existência de Arquivos no PowerShell: Guia Abrangente

Você usa o PowerShell para criar, ler, atualizar e excluir arquivos? Se sim, você provavelmente já encontrou erros quando os arquivos de destino não existem ou já existem. Felizmente, existem maneiras no PowerShell de verificar se um arquivo existe antes de fazer qualquer coisa com ele.

Por exemplo, em vez de permitir que seu código crie o arquivo imediatamente, é melhor testar se o arquivo já existe. Conforme mostrado na captura de tela abaixo, você pode escrever um código melhor e obter uma saída clara.

Creating a file that already exists

Neste artigo, você aprenderá as diferentes maneiras de usar o PowerShell para verificar se um arquivo existe. Você também aprenderá como usar cada uma dessas maneiras para produzir um código melhor e obter resultados com lógica de tratamento de erros.

Pré-requisitos

Reduza as chamadas para o service desk e atualize as credenciais em cache para usuários remotos, mesmo sem VPN, com uma solução de redefinição de senha de autoatendimento. Obtenha uma demonstração do Specops uReset!

Este artigo é um guia prático no qual você aprenderá com diferentes exemplos. E para seguir os exemplos, você precisará do seguinte:

  • Editor de código. Os recomendados são o Visual Studio Code e o Atom, que funcionam em várias plataformas. Você também pode usar o Windows PowerShell ISE se estiver trabalhando em um computador com Windows.
  • Windows PowerShell 5.1 (Desktop) ou PowerShell 7.1 (Core). Os comandos e scripts neste artigo se aplicam a ambas as edições do PowerShell. Independentemente de você estar usando Windows, Linux ou macOS, você estará bem desde que tenha o PowerShell instalado.

Relacionado: Como Baixar e Instalar o PowerShell 7 no Windows, Linux e macOS

Usando o PowerShell para Verificar Se o Arquivo Existe

Este artigo cobre três métodos para usar o PowerShell para verificar se um arquivo existe. O uso desses três métodos difere, mas o conceito e o objetivo final são os mesmos. Essas três maneiras são:

  • Test-Path Cmdlet.
  • Get-Item e Get-ChildItem Cmdlet.
  • System.IO.File Class.

Haverá exemplos e demonstrações de cada um desses três métodos, incluindo como usá-los com tratamento de erro.

Usando Test-Path

A primeira maneira é o cmdlet Test-Path, especificamente projetado para determinar se um caminho ou arquivo existe. Ao usar este cmdlet para testar se um arquivo existe, o resultado é true ou false. O resultado indica se o arquivo existe ou não.

Abaixo está a sintaxe básica para fazer o cmdlet Test-Path funcionar ao verificar um arquivo.

Test-Path -Path <PATH to FILE> -PathType Leaf

Por exemplo, se precisar verificar se um arquivo com o nome C:\temp\important_file.txt existe, use o código abaixo. Note que a parte -PathType Leaf diz ao cmdlet para verificar um arquivo e não um diretório explicitamente.

Test-Path -Path C:\temp\important_file.txt -PathType Leaf

Quando executar o comando acima no PowerShell, o resultado retornará True se o arquivo existir. Caso contrário, o resultado será False, como pode ser visto na captura de tela abaixo.

Using Test-Path in PowerShell to check if a file exists

Relacionado: Como Usar o Cmdlet Test-Path do PowerShell

Exemplo: Criando um Arquivo Se o Arquivo Não Existir

Este exemplo é um caso de uso típico para criar arquivos em um local especificado. Para evitar o erro “arquivo já existe”, o script verifica se o arquivo já existe antes de criá-lo. Se o arquivo existir, o script exibe uma mensagem e não tenta criar o arquivo novamente.

Copie o código abaixo e salve-o em um arquivo chamado Create-NewFile.ps1. Certifique-se de alterar o valor da variável $path se desejar alterar o local de saída do arquivo. Após salvar o script, execute-o no PowerShell para testar.

# Create-NewFile.ps1

# Caminho completo do arquivo
$file = 'c:\temp\important_file.txt'

# Se o arquivo não existir, crie-o.
if (-not(Test-Path -Path $file -PathType Leaf)) {
     try {
         $null = New-Item -ItemType File -Path $file -Force -ErrorAction Stop
         Write-Host "The file [$file] has been created."
     }
     catch {
         throw $_.Exception.Message
     }
 }
# Se o arquivo já existir, exiba a mensagem e não faça nada.
 else {
     Write-Host "Cannot create [$file] because a file with that name already exists."
 }

A captura de tela abaixo mostra as duas saídas diferentes. A primeira é ao executar o script quando o arquivo não existe. A segunda é após a criação do arquivo, e ele já existe.

Running the PowerShell script to create a file

Relacionado: De Volta aos Fundamentos: Como Executar um Script do PowerShell

Usando Get-Item e Get-ChildItem

O propósito do cmdlet Get-Item é obter o item em uma localização especificada. Em comparação, o cmdlet Get-ChildItem é para obter os itens e subitens em uma ou mais localizações especificadas. A funcionalidade desses dois cmdlets não é explicitamente verificar se os arquivos existem.

O que acontece quando você usa Get-Item ou Get-ChildItem para obter um item que não existe? Você receberá um erro para cada arquivo ausente. Tome os comandos abaixo como exemplo.

$file = 'c:\temp\important_file.txt'
Get-Item -Path $file
Get-ChildItem -Path $file

Suponha que o arquivo c:\temp\important_file.txt não exista. Cada um dos comandos acima retorna um erro. Como você pode ver pelo exemplo abaixo, a mensagem de erro para ambos os comandos é a mesma.

Using Get-Item and Get-ChildItem in PowerShell to check if a file exists

Exemplo: Arquivando o Arquivo Existente e Criando um Novo Arquivo

Neste exemplo, o script utiliza os cmdlets Get-Item e Test-Path. A lógica deste script é fazer o seguinte:

  • Teste se a pasta de arquivo existe usando Test-Path.
    • Se a pasta de arquivo não existir, o script cria uma nova pasta de arquivo nesse formato – yyyy-MMM-dd_hh-mm-ss-tt.
    • Em seguida, o script move o arquivo antigo para a pasta de arquivo.
  • Teste se o arquivo já existe usando Get-Item.
    • Se o arquivo existir, o script o move para a pasta de arquivo primeiro. Depois, o script cria o novo arquivo no local original.
    • Se o arquivo não existir, o script cria o novo arquivo.

Copie o código abaixo e salve-o como Create-NewFileAfterArchive.ps1. Depois de salvar o script, execute-o no PowerShell e verifique os resultados.

# Criar-NovoArquivoAposArquivamento.ps1

# Caminho completo do arquivo
$file = 'c:\temp\important_file.txt'

# Caminho completo da pasta de arquivamento
$archiveFolder = "c:\temp\archive_$(get-date -Format 'yyyy-MMM-dd_hh-mm-ss-tt')\"

# Se o arquivo existir, movê-lo para a pasta de arquivamento e, em seguida, criar um novo arquivo.
if (Get-Item -Path $file -ErrorAction Ignore) {
    try {
        ## Se a pasta de arquivamento não existir, crie-a agora.
        if (-not(Test-Path -Path $archiveFolder -PathType Container)) {
            $null = New-Item -ItemType Directory -Path $archiveFolder -ErrorAction STOP
        }
        ## Mover o arquivo existente para o arquivamento.
        Move-Item -Path $file -Destination $archiveFolder -Force -ErrorAction STOP
        Write-Host "The old file [$file] has been archived to [$archiveFolder]"
     } catch {
        throw $_.Exception.Message
     }
 }
 Create the new file
 try {
     $null = New-Item -ItemType File -Path $file -Force -ErrorAction Stop
     Write-Host "The new file [$file] has been created."
 } catch {
    Write-Host $_.Exception.Message
 }

Dica: O parâmetro -ErrorAction Ignore suprime o erro (não será exibido no console) e também não registra o erro na variável automática $error.

Na captura de tela abaixo, a primeira execução do script criou o arquivo c:\temp\important_file.txt. As execuções sucessivas do script criaram uma nova pasta de arquivamento a cada vez, moveram o arquivo existente para a pasta de arquivamento e, em seguida, criaram um novo arquivo em c:\temp\important_file.txt.

Running a script in PowerShell to check if a file exists using Get-Item

Usando o Método .NET [System.IO.File]::Exists()

O último método a ser aprendido neste artigo é a classe .NET System.IO.File, especificamente o método Exists(). Uma das forças do PowerShell é sua capacidade de importar e usar classes e métodos .NET.

Por exemplo, para usar o método Exists() em PowerShell para verificar se um arquivo existe, use o código abaixo.

[System.IO.File]::Exists("PATH")

O método acima produz um resultado booleano – true ou false. Se o resultado retornar true, significa que o arquivo alvo existe. Caso contrário, o resultado retornado é false quando o arquivo alvo não existe.

No código de exemplo abaixo, o comando verifica a existência do arquivo c:\temp\important_file.txt.

$file = 'c:\temp\important_file.txt'
[System.IO.File]::Exists($file)

Como você pode ver no resultado abaixo, o resultado retorna verdadeiro, confirmando que o arquivo existe.

Using System.IO.File class in PowerShell

Com este método .NET, você também pode usar operações ternárias como o exemplo abaixo. Em vez de mostrar os resultados padrão verdadeiro ou falso, você pode personalizar a mensagem de resultado com uma implementação mais curta. No entanto, o operador ternário neste exemplo só se aplica ao PowerShell 7+.

$file = 'c:\temp\important_file.txt'
[System.IO.File]::Exists($file) ? "The file exists." : "The file does not exist."

Exemplo: Atualizando o Conteúdo do Arquivo Se o Arquivo Existir

Este script de exemplo atualiza o arquivo de texto anexando um novo valor GUID. No entanto, a atualização do conteúdo só ocorre se o arquivo existir. Caso contrário, o script exibe uma mensagem e não faz mais nada.

Copie o script abaixo e salve-o como Update-FileContents.ps1. Altere o valor do caminho do arquivo da variável $file se necessário. Em seguida, execute o script no PowerShell para testá-lo.

# Update-FileContents.ps1

#Caminho completo do arquivo
$file = 'c:\temp\important_file.txt'

# Se o arquivo existe, anexe um novo valor GUID no arquivo.
if ([System.IO.File]::Exists($file)) {
    try {
        $newValue = ((New-Guid).Guid)
        Add-Content -Path $file -Value $newValue -ErrorAction STOP
        Write-Host "The file [$file] has been updated with [$newValue]"
     } catch {
        throw $_.Exception.Message
     }    
 }

# Se o arquivo não existe, mostre uma mensagem e não faça nada.
 else {
     Write-Host "The file [$file] could not be updated because it does not exist."
 }

Você pode ver na captura de tela abaixo que o script atualizou o arquivo durante cada execução. A atualização ocorreu porque o método [System.IO.File]::Exists() confirmou que o arquivo c:\temp\important_file.txt existe.

No final, usando o comando gc c:\temp\important_file.txt para ler o conteúdo do arquivo, confirmou-se que o script atualizou o arquivo com os valores GUID.

Using [System.IO.File]::Exists() .NET Method in PowerShell

Relacionado: Usando Aceleradores de Tipos de Dados do PowerShell para Acelerar a Codificação

Conclusão

Reduza as chamadas para o service desk & atualize as credenciais do cache para usuários remotos mesmo sem VPN com uma solução de redefinição de senha de autoatendimento. Obtenha uma Demonstração do Specops uReset!

Neste artigo, você aprendeu que há mais de uma maneira de usar o PowerShell para verificar se um arquivo existe. É uma boa prática verificar a presença de um arquivo antes de fazer quaisquer modificações relacionadas ao arquivo.

Você aprendeu sobre o uso dos cmdlets Get-Item, Get-ChildItem e Test-Path. Bem como o método [System.IO.File]::Exists() .NET. Os exemplos mostraram como usar técnicas e como combiná-las com lógica de tratamento de erros.

Pare de suportar essas mensagens de erro. Supere-as adicionando código para verificar se um arquivo existe antes de qualquer operação relacionada a arquivos. As técnicas que você aprendeu aqui cobrem apenas o básico, e agora cabe a você melhorá-las.

Source:
https://adamtheautomator.com/powershell-check-if-file-exists/