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
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.
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
0 comentários