Neste pequeno artigo descrevo como usar o cmdlet Test-Path para verificar se uma pasta existe. Tipo Get-Help Test-Path para informação incorporada. Também demonstro brevemente como utilizar o método de classe .NET Exists() da classe System.IO.Directory.

br>

Tweet

br>>>/p>

br>>>/p>h2>Como verificar se existe uma pasta com PowerShell

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

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

Lembra-te de que precisas de aspas simples ou duplas em torno do caminho se este contiver um espaço. As aspas simples são recomendadas, uma vez que não expandem/substituem/interpolam variáveis.

Para garantir explicitamente que é um directório e não um ficheiro, utilize o parâmetro -PathType que aceita os seguintes valores:

  • Any
  • Leaf (ficheiro)
  • Container (directório/pasta)
PS C:\> Test-Path C:\Windows -PathType AnyTruePS C:\> Test-Path C:\Windows -PathType ContainerTruePS C:\> Test-Path C:\Windows -PathType LeafFalse

Screenshot Example

Powershell-how-to-check-if-folder-exists.png

Utilização de Script

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

Portanto, lembre-se que se o caminho ou nome da pasta 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 da pasta, 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.

PS C:\> if ( Test-Path -Path 'C:\Windows' -PathType Container ) { "It's a container/folder/directory" }It's a container/folder/directoryPS C:\> if ( -not (Test-Path -LiteralPath 'C:\Windows' -PathType Leaf) ) { "It's not a leaf/file" }It's not a leaf/file

Deverá também estar ciente do parâmetro -LiteralPath to Test-Path, que pode ver no segundo exemplo acima. Isto também funciona se o seu ficheiro contiver caracteres como parênteses que fazem com que o parâmetro -Path expanda o caminho, uma vez que suporta a sintaxe wildcard por defeito. Use -LiteralPath se não precisar de expansão a partir de -Path, pois é a escolha mais segura para ficheiros de nome estranho.

Criar um directório se não existir

Criar um directório se este não existir, este é um exemplo muito robusto de como pode querer lidar com ele. Adapte-se às suas necessidades.

Este código foi colocado no ficheiro “NewDirDemo.ps1” que me vê utilizando abaixo.

Param( $DirectoryToCreate)if (-not (Test-Path -LiteralPath $DirectoryToCreate)) { try { New-Item -Path $DirectoryToCreate -ItemType Directory -ErrorAction Stop | Out-Null #-Force } catch { Write-Error -Message "Unable to create directory '$DirectoryToCreate'. Error was: $_" -ErrorAction Stop } "Successfully created directory '$DirectoryToCreate'."}else { "Directory already existed"}

Demonstração de utilização no seguinte screenshot.

Criar dir se não existir.jpg

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:

PS C:\> Test-Path C:\Windows -PathType fooTest-Path : Cannot bind parameter 'PathType'. Cannot convert value "foo" to type"Microsoft.PowerShell.Commands.TestPathType" due to invalid enumeration values.Specify one of the following enumeration values and try again.The possible enumeration values are "Any, Container, Leaf".At line:1 char:31+ Test-Path C:\Windows -PathType <<<< foo + CategoryInfo : InvalidArgument: (:) , ParameterBindingException + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.TestPathCommand

Utilizar o sistema .NET.IO.Método de classe de directório “Exists”

Também pode usar o método Exists() do Sistema .NET.IO.Directory class, que requer um caminho completo:

PS E:\temp> ::Exists('E:\temp\')TruePS E:\temp> ::Exists('E:\temp')True

Se quiser verificar se o directório em que o script/programa está actualmente contém um subdirectório, pode usar o truque que demonstro abaixo – onde verifico se existe um subdirectório chamado “Windows”.

No PowerShell, o namespace “System” não tem de ser digitado explicitamente, por isso pode omiti-lo.

PS C:\> ::Exists( (Join-Path (Get-Location) 'Windows') )TruePS C:\> cd E:\tempPS E:\temp> ::Exists( (Join-Path (Get-Location) 'Windows') )False

Categorias: Articles

0 comentários

Deixe uma resposta

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