Utilizar o percurso de teste com powershell para verificar se um ficheiro existe

Neste pequeno artigo descrevo como usar o percurso de teste cmdlet para verificar se um ficheiro existe – bem como uma alternativa .NET que um colega de trabalho uma vez teve de usar em algum contexto SCOM. Digite Get-Help Test-Path para mais informações, possivelmente com a opção “-online”. Também demonstro rapidamente o método de classe .NET Exists() do System.IO.File class.

I também demonstro como criar um novo ficheiro se não existir actualmente e mostro como lidar com falhas para criar o ficheiro graciosamente.

A documentação oficial online da Microsoft está aqui neste link.

br>

Tweet

br>>>/p>

br>>>/p>h2>Como verificar se um ficheiro existe com PowerShell

P>Pode usar algo como isto para verificação na linha de comando:

PS C:\> Test-Path C:\WindowsTrue

Esteja ciente de que precisa de citações se o caminho contém espaços, parênteses – e possivelmente outros caracteres que não consigo pensar agora. PowerShell adiciona automaticamente as citações quando o separador é preenchido. Recomendo a utilização de aspas simples, porque as aspas duplas “expandem” variáveis (a maioria relevante se tiver “$” no caminho).

PS C:\> Test-Path -Path 'C:\Program Files'True

Outra forma verá algo como isto:

PS C:\> Test-Path C:\Program FilesTest-Path : A positional parameter cannot be found that accepts argument 'Files'.

Para se certificar explicitamente de que se trata de um ficheiro e não de um directório, utilize o parâmetro -PathType que tem os seguintes valores possíveis

  • Any
  • Leaf (file)
  • Container (directório/pasta)

Screenshot Example

Utilização de Script

Num script, tipicamente utilizá-lo-ia numa declaração if. Para negar e verificar se a pasta ou ficheiro não existe, utilize “!” ou “-not”, e lembre-se de anexar a declaração Test-Path entre parênteses.

Também se lembre que se o caminho ou nome do ficheiro contiver um espaço, terá de rodear todo o caminho entre aspas. Aspas simples ou aspas duplas funcionarão da mesma forma se não houver partes “expansíveis” no caminho ou no nome do ficheiro, mas a escolha ligeiramente mais segura é aspas simples. Isto é o que o PowerShell faz por defeito quando se auto-completa nomes com separador no prompt.

Também deve estar ciente da diferença entre -Caminho e -CaminhoLiteral. Este último tomará o caminho literalmente, como o nome indica, enquanto o primeiro suporta a sintaxe wildcard. Isto é frequentemente descoberto por acidente quando alguém encontra um ficheiro com parênteses irregulares, porque faz parte da mesma sintaxe – como em um dígito hexadecimal. Isto irá causar mensagens de erro, pelo menos nas versões anteriores do PowerShell, quando se usa o -Path. Ao listar estruturas de directórios a partir de um directório raiz, use -LiteralPath. E a menos que precise de suporte de wildcard, é a escolha mais segura.

Criar um ficheiro se este não existir

P>Pode usar o cmdlet Set-Content para criar um novo ficheiro se este não existir actualmente.

Veja os meus exemplos e Get-Help Set-Content ou Microsoft Docs online aqui neste link.

Tambem pode usar o Out-File e outros métodos que não me darei ao trabalho de elaborar aqui.

Obviamente pode usar um $Variable com o nome do ficheiro no lugar do texto codificado aqui.

Esta opção apenas cria um ficheiro com uma cadeia de caracteres vazia como conteúdo.

Or pode fazê-lo desta forma se trabalhar na linha de comando ou se se adequar à sua fantasia:

"" | Set-Content x:\path\filenamehere.xml

P>P>Puvi que é bom demonstrar o que é provavelmente considerado a forma mais adequada de utilização do script primeiro.

Se quiser testar a existência de falhas na criação do ficheiro, pode usar uma declaração de tentativa {} catch {} juntamente com o parâmetro e o valor “-ErrorAction Stop” para o cmdlet que cria o ficheiro, e.g. Set-Content ou Out-File.

Aqui está um exemplo rápido:

Ver é acreditar muitas vezes (por vezes erradamente, mas isso é outra história), por isso aqui está um ecrã dump do PowerShell ISE a executar este exemplo armazenado num ficheiro de script .ps1.

Enumerar Possíveis Valores PathType

Um pequeno “truque” para ver os possíveis valores de enumeração para -PathType é usar um que não existe, como este:

E notamos a parte onde diz:

The possible enumeration values are "Any, Container, Leaf".

Utilizando o .NET System.IO.File Class Method “Exists”

P>Pode também usar o método Exists() do .NET System.IO.File class:

PS E:\temp> ::Exists('E:\temp\csv1.csv')True

No PowerShell, o espaço de nomes “System” é opcional, por isso pode simplesmente usar também “Io.File”.

Uma coisa a ter em conta, é que com este método, é necessário um caminho completo. Para verificar se um ficheiro está no directório actual com o método IO.File Exists(), pode usar algo como isto, onde normalmente usaria uma variável com o nome do ficheiro em vez do “test.ps1”:

aqui codificado.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *