Si necesitas validar una ruta a un archivo, clave de registro, certificado, u cualquier otra ruta de PowerShell drive, necesitas el cmdlet Test-Path.
El cmdlet Test-Path es una forma simple pero útil de verificar rápidamente muchas propiedades de un archivo y otros elementos. Puede verificar si un archivo existe (o otros tipos de elementos), si una cadena está en el formato de ruta correcto, o incluso si un elemento es más nuevo o más antiguo que un tiempo específico.
En este tutorial, vas a aprender todo sobre el cmdlet Test-Path de PowerShell y cómo puedes usarlo para mejorar tus scripts de PowerShell.
Prerrequisitos
Si quieres seguir los ejemplos en este tutorial, necesitarás una cosa: PowerShell. Más específicamente, el tutorial utilizará PowerShell v7.03 en Windows 10, aunque muchas de las técnicas que aprenderás también se aplicarán a versiones anteriores.
¿Qué hace el cmdlet Test-Path?
El cmdlet Test-Path de PowerShell es uno de los comandos más simples. Es un comando que ha estado en PowerShell desde el principio y solo devuelve dos valores: Verdadero o Falso.
Pero no dejes que la simplicidad te engañe; te ahorrará mucho tiempo al validar información en tus scripts de PowerShell.
Piensa en el cmdlet Test-Path de PowerShell como control de calidad al trabajar con proveedores y unidades de PowerShell. Al escribir un script, comúnmente trabajarás con varios elementos contenidos en las unidades de PowerShell. Unidades de PowerShell como C:\, HKLM, Cert, y así sucesivamente.
Test-Path
no funciona con todas las unidades de PS. Por ejemplo, si intentas usarTest-Path
contra una clave de registro, funcionará. Si intentas usarTest-Path
contra un valor de registro, devolveráFalse
cada vez.
Si estás curioso, ejecuta el cmdlet Get-PSDrive
ahora mismo en PowerShell y observa todas las unidades de PS que aparecen para ti.

Todas estas unidades tienen rutas en su interior como C:\Windows, HKLM:\Software, etc. Al trabajar con rutas dentro de tus scripts de PowerShell, siempre es buena práctica primero probar si la ruta es válida o existe o no. Esto es lo que hace Test-Path
de PowerShell.
Test-Path
define una condición que devuelve True
o False
dependiendo de si se cumple una condición específica (típicamente si un archivo/carpeta, clave de registro, certificado, o incluso una variable existe o no).
Parámetros y Uso de Test-Path
Como muchos otros cmdlets de PowerShell, el cmdlet Test-Path
tiene varios parámetros que cambian su comportamiento. Ahora cubriremos cada parámetro y demostraremos cómo funciona y qué tipo de resultados podrías esperar ver.
Path
El parámetro Path
es un parámetro obligatorio que usarás en cada ejecución de Test-Path
. El parámetro Path
define la ruta del PSDrive que te gustaría probar para comprobar si existe.
Si, por ejemplo, quieres comprobar si existe o no la carpeta C:\Foo, proporcionarías la ruta apropiada al parámetro Path
. Luego, dependiendo de si C:\Foo existe realmente o no, Test-Path
devolvería True
o False
.
La misma técnica se puede utilizar para cualquier ruta de elemento también. Tal vez quieras comprobar si existe o no la clave del registro HKLM:\Software\Foo. Simplemente usa la ruta de la clave del registro con el parámetro Path
.
Recuerda que todas las técnicas demostradas a lo largo de este tutorial funcionarán con cualquier ruta de unidad de PowerShell.
Uso de Comodines
¿Qué pasa si no te importa necesariamente si una ruta tiene un valor literal? En su lugar, ¿te gustaría verificar si una ruta coincide con un patrón específico? En ese caso, puedes usar comodines en el valor de Path
.
Tal vez quieras comprobar si tu carpeta C:\Foo contiene alguna subcarpeta que comience con Bar. En ese caso, podrías usar un comodín.
Una vez que ejecutes el comando anterior, Test-Path
verificará la existencia de cualquier carpeta que comience con Bar y devolverá True
o False
dependiendo de si existe o no alguna carpeta que cumpla con ese criterio.
Los asteriscos (*
) coinciden con uno o más caracteres, pero también puedes usar signos de interrogación (?
) para obtener una prueba más detallada y verificar un solo carácter.
Usando el escenario anterior como ejemplo, si la carpeta C:\Foo\Bar1 existe, podrías buscar cualquier subcarpeta de Foo que comience con Bar y tenga exactamente cuatro caracteres utilizando el siguiente comando.
Si, por alguna razón, deseas utilizar el parámetro
Path
con comodines pero deseas coincidir literalmente con un carácter comodín como*
, siempre puedes escapar los caracteres comodín con un acento invertido (`).
LiteralPath
El parámetro LiteralPath
es casi idéntico al parámetro Path
con una excepción; no permite comodines. Usar LiteralPath
interpretará el valor de la ruta literalmente.
Por ejemplo, si intentas usar un asterisco o un signo de interrogación dentro del valor de la ruta utilizando LIteralPath
, Test-Path
ignorará por completo los caracteres comodín y probará literalmente para C:\Foo\Bar? como en el siguiente ejemplo.
Deberías usar
LiteralPath
como el parámetro de ruta predeterminado si no necesitas usar ningún carácter comodín para asegurarte de queTest-Path
pruebe la ruta que estás esperando.
PathType
Por defecto, cuando ejecutas Test-Path
y le proporcionas una ruta, devolverá True
si encuentra algo en esa ruta. El elemento con una ruta podría ser un contenedor como una carpeta de archivos, una clave de registro, una tienda de certificados, etc., o una hoja como un archivo, un valor de registro o un certificado.
Puedes forzar a Test-Path
a ser más específico y probar específicamente un contenedor o un elemento de hoja usando el parámetro PathType
.
Test-Path utiliza el valor
Any
delPathType
por defecto.
Si, por ejemplo, hay una carpeta en C:\Foo\Bar y estás buscando un archivo en esa ruta, podrías usar el parámetro PathType
como se muestra a continuación. Quieres verificar solo si existe un archivo llamado C:\Foo\Bar.
Tal vez en su lugar, necesitas confirmar si C:\Foo\Bar es realmente un archivo. En ese caso, verificarías un contenedor.
Include
Si estás utilizando el parámetro Path
y comodines, a veces necesitarás ser más específico. En ese caso, necesitas considerar los parámetros Include
y Exclude
.
Digamos que tienes las siguientes carpetas:
- C:\Foo\Bar1
- C:\Foo\Bar2
- C:\Foo\Bar3
Te gustaría verificar si existe alguna carpeta que comience con Bar y tenga exactamente cuatro caracteres como Bar1, Bar2, etc.
El comando anterior funciona bien, pero ahora quieres encontrar solo las carpetas en C:\Foo llamadas Bar2. En ese caso, podrías usar el parámetro Include
.
El comando anterior ahora solo prueba básicamente una sola carpeta C:\Foo\Bar2. Probablemente sería mejor usar Test-Path -Path 'C:\Foo\Bar2' -PathType Container
en su lugar.
Excluir
El parámetro Exclude
funciona de manera similar al parámetro Include
, excepto que esta vez excluye las rutas que coinciden con una cadena.
Tal vez quieras asegurarte de que haya al menos un archivo dentro de la carpeta C:\Foo, y uses el siguiente comando:
El comando anterior devuelve True
o False
si hay algún archivo en C:\Foo. Pero tal vez quieras asegurarte de que haya archivos excepto los que tengan una extensión de archivo txt
. En ese caso, podrías usar el parámetro Exclude
usando un comodín para excluir todos los archivos con la extensión txt
de la prueba.
Filtrar
Según la documentación de Microsoft, el parámetro Filter
“especifica un filtro en el formato o lenguaje del proveedor. El valor de este parámetro califica como el parámetro Path
. La sintaxis del filtro, incluido el uso de caracteres comodín, depende del proveedor”.
Aunque el parámetro Filter
debería usarse con otros cmdlets como Get-Childitem
, por ejemplo, rara vez, si es que alguna vez, se usa con Test-Path
. Si has encontrado un buen uso para el parámetro Filter
, por favor, contáctame en Twitter en @adbertram.
Relacionado: Get-ChildItem: Listando Archivos, Registro, Certificados y Más en Uno
NewerThan
¿Alguna vez has necesitado verificar la marca de tiempo de un archivo y tomar una decisión basada en eso? Si es así, los parámetros NewerThan
y OlderThan
ahorran mucho código. El parámetro NewerThan
verifica si la marca de tiempo de un elemento es más reciente que una fecha específica.
El parámetro NewerThan
acepta una cadena o un objeto DateTime para representar una marca de tiempo a verificar. Por ejemplo, para verificar si el archivo C:\Foo\bar.txt fue creado después del 20 de enero de 2021, ejecutarías Test-Path
de la siguiente manera.
OlderThan
El parámetro OlderThan
es exactamente igual que el parámetro NewerThan
pero al revés. Este parámetro verifica si un elemento es más antiguo que una fecha específica.
IsValid
Si alguna vez has construido dinámicamente una ruta en un script, conocerás la lucha. A veces puedes presionar incorrectamente una tecla o de alguna manera obtener un carácter especial en una ruta; si es así, el parámetro IsValid
es para ti.
El parámetro IsValid
es un parámetro único que convierte Test-Path
, no en un cmdlet que verifica la existencia de un elemento, sino en uno que verifica la sintaxis de la ruta. Este parámetro confirma si una ruta es válida solo.
Por ejemplo, tal vez necesites verificar si una ruta es sintácticamente válida. Estás trabajando con un par de variables y las concatenas para construir una ruta.
Cuando concatenes rutas, siempre utiliza el cmdlet
Join-Path
. ¡Esto es solo para fines de ejemplo!
Ahora, para asegurarte de que la ruta que has creado dinámicamente sea válida, utiliza el parámetro IsValid
como se muestra a continuación. Te darás cuenta de que Test-Path
devuelve False
.
La ruta abc:dffC:\
no es una ruta válida, lo que te permite crear una rutina de validación a partir de esta situación.
Si estás utilizando PowerShell v6.1.2 o anterior y estás utilizando los parámetros
IsValid
yPathType
juntos,Test-Path
ignorará el parámetroPathType
.
Credencial
Aunque encuentres el parámetro Credential
en Test-Path
, podrías pensar que puedes usarlo para autenticar los PS drives como otro usuario. Esa es una suposición válida, pero es incorrecta.
Desafortunadamente, el parámetro Credential
no hace mucho con el cmdlet Test-Path
. Microsoft recomienda usar el cmdlet Invoke-Command
y utilizar el parámetro Credential
allí si deseas invocar Test-Path
con credenciales alternativas.
Relacionado: Invoke-Command: La mejor manera de ejecutar código de forma remota