En este pequeño artículo describo cómo utilizar el cmdlet Test-Path para comprobar si una carpeta existe. Escribe Get-Help Test-Path para obtener información integrada. También demuestro brevemente cómo utilizar el método de la clase .NET Exists() de la clase System.IO.Directory.

Tweet

Cómo comprobar si una carpeta existe con PowerShell

Puedes usar algo como esto para verificar en la línea de comandos:

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

Recuerda que necesitas comillas simples o dobles alrededor de la ruta si contiene un espacio. Se recomiendan las comillas simples, ya que no expanden/sustituyen/interpolan variables.

Para asegurarse explícitamente de que es un directorio y no un archivo, utilice el parámetro -PathType que acepta los siguientes valores:

  • Cualquiera
  • Hoja (archivo)
  • Contenedor (directorio/carpeta)
PS C:\> Test-Path C:\Windows -PathType AnyTruePS C:\> Test-Path C:\Windows -PathType ContainerTruePS C:\> Test-Path C:\Windows -PathType LeafFalse

Ejemplo de captura de pantalla

Powershell-cómo-comprobar-si-existe-la-carpeta.png

Uso del script

En un script, normalmente lo usarías en una sentencia if. Para negar y comprobar si la carpeta o el archivo no existe, utilice «!» o «-not», y recuerde encerrar la declaración Test-Path entre paréntesis.

También recuerde que si la ruta o el nombre de la carpeta contiene un espacio, debe rodear toda la ruta entre comillas. Las comillas simples o las comillas dobles funcionarán igual si no hay partes «expandibles» en la ruta o el nombre de la carpeta, pero la opción ligeramente más segura son las comillas simples. Esto es lo que PowerShell hace por defecto cuando autocompleta los nombres con el tabulador en el 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

También debes tener en cuenta el parámetro -LiteralPath a Test-Path, que puedes ver en el segundo ejemplo anterior. Esto también funciona si su archivo contiene caracteres como paréntesis que hace que el parámetro -Path expanda la ruta ya que soporta la sintaxis de comodines por defecto. Utilice -LiteralPath si no necesita la expansión de -Path ya que es la opción más segura para los archivos con nombres extraños.

Crear un directorio si no existe

Para crear un directorio si no existe, este es un ejemplo muy robusto de cómo podría querer manejarlo. Adáptalo a tus necesidades.

Este código lo he puesto en el archivo «NewDirDemo.ps1» que me ves usar a continuación.

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

Demostración de uso en la siguiente captura de pantalla.

Crear dir si no existe.jpg

Enumeración de posibles valores de PathType

Un pequeño «truco» para ver los posibles valores de enumeración de -PathType es utilizar uno que no exista, así:

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

Usando el método de clase System.IO.Directory Class Method «Exists»

También puedes usar el método Exists() de la clase .NET System.IO.Directory, que requiere una ruta completa:

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

Si quieres comprobar si el directorio en el que se encuentra el script/programa contiene un subdirectorio, puedes usar el truco que demuestro a continuación – donde compruebo si hay un subdirectorio llamado «Windows».

En PowerShell, el espacio de nombres «System» no tiene que ser escrito explícitamente, por lo que puedes omitirlo.

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

Categorías: Articles

0 comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *