Utilizar test-path con powershell para comprobar si un archivo existe

En este pequeño artículo describo cómo utilizar el cmdlet Test-Path para comprobar si un archivo existe – así como una alternativa .NET que un compañero de trabajo tuvo que utilizar una vez en algún contexto de SCOM. Escriba Get-Help Test-Path para obtener más información, posiblemente con el modificador «-online». También demuestro rápidamente el método de la clase .NET Exists() de la clase System.IO.File.

También demuestro cómo crear un nuevo archivo si no existe uno actualmente y muestro cómo manejar los fallos para crear el archivo con gracia.

La documentación oficial en línea de Microsoft está aquí en este enlace.

Tweet

Cómo comprobar si un archivo existe con PowerShell

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

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

Ten en cuenta que necesitas comillas si la ruta contiene espacios, paréntesis – y posiblemente otros caracteres que no se me ocurren ahora. PowerShell añade automáticamente las comillas al completar el tabulador. Recomiendo usar comillas simples, porque las comillas dobles «expanden» las variables (sobre todo relevante si tienes «$» en la ruta).

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

De lo contrario verás algo así:

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

Para asegurarte explícitamente de que es un archivo y no un directorio, utiliza el parámetro -PathType que tiene los siguientes valores posibles:

  • Cualquiera
  • Hoja (archivo)
  • Contenedor (directorio/carpeta)

Ejemplo de pantalla

Uso de scripts

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 del archivo 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 del archivo, pero la opción ligeramente más segura son las comillas simples. Esto es lo que PowerShell hace por defecto cuando usted autocompleta los nombres con el tabulador en el prompt.

También debe ser consciente de la diferencia entre -Path y -LiteralPath. Este último tomará la ruta literalmente, como su nombre indica, mientras que el primero admite la sintaxis de comodines. Esto se descubre a menudo por accidente cuando alguien se encuentra con un archivo con paréntesis desiguales en él, porque es parte de la misma sintaxis -como utiliza, como para un dígito hexadecimal. Esto causará mensajes de error, al menos en versiones anteriores de PowerShell, cuando se utiliza -Path. Al listar estructuras de directorios desde un directorio raíz, utilice -LiteralPath. Y a menos que necesite soporte de comodines, es la opción más segura.

Crear un archivo si no existe

Puede utilizar el cmdlet Set-Content para crear un nuevo archivo si no existe actualmente.

Vea mis ejemplos y Get-Help Set-Content o Microsoft Docs online aquí en este enlace.

También puede utilizar Out-File y otros métodos que no me molestaré en elaborar aquí.

Por supuesto, puede utilizar una $Variable con el nombre del archivo en lugar del texto codificado aquí.

Esto sólo crea un archivo con una cadena vacía como su contenido.

O puedes hacerlo así si trabajas en la línea de comandos o si se adapta a tu fantasía:

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

Me imaginé que es bueno demostrar lo que probablemente se considera la forma más adecuada de uso del script primero.

Si quieres comprobar si hay fallos en la creación del archivo, puedes utilizar una sentencia try {} catch {} junto con el parámetro y valor «-ErrorAction Stop» al cmdlet que crea el archivo, por ejemplo.g. Set-Content o Out-File.

Aquí tienes un ejemplo rápido:

Ver es creer a menudo (a veces de forma errónea, pero esa es otra historia), así que aquí tienes un volcado de pantalla de PowerShell ISE ejecutando este ejemplo almacenado en un archivo de script .ps1.

Enumeración de los posibles valores de PathType

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

Y nos fijamos en la parte donde dice:

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

Usando la clase .NET System.IO.File Class Method «Exists»

También puedes utilizar el método Exists() de la clase .NET System.IO.File:

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

En PowerShell, el espacio de nombres «System» es opcional, por lo que puedes utilizar simplemente «Io.File» también.

Una cosa a tener en cuenta, es que con este método, necesitas una ruta completa. Para comprobar si un archivo está en el directorio actual con el método IO.File Exists(), puede utilizar algo como esto, donde normalmente se utiliza una variable con el nombre del archivo en lugar de la aquí codificada «test.ps1»:

Deja una respuesta

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