Cómo dividir rutas con el cmdlet Split-Path de PowerShell

¿Necesitas dividir rutas para obtener partes específicas de ella? Si es así, entonces PowerShell `Split-Path` es el amigo en el que puedes confiar. Cuando trabajas con archivos, certificados y el registro, notarás que las rutas representan sus ubicaciones.

Y en algún momento, es posible que necesites filtrar qué parte de una ruta devolver, quizás al hacer automatización. ¡Tienes suerte, porque este tutorial te enseñará formas de usar el cmdlet `Split-Path` de PowerShell para hacerlo!

¡Vamos! ¡Sigue leyendo y te daremos un nuevo arma para tu arsenal de PowerShell!

Prerrequisitos

Si planeas seguir los ejemplos de este tutorial práctico, necesitarás una computadora con cualquier versión moderna de Windows que tenga PowerShell 5.1 o superior. Este tutorial utilizará Windows 10 20H2 con PowerShell 7.1.1.

¿Qué hay en una ruta?

Antes de adentrarnos en profundidad con el cmdlet `Split-Path` de PowerShell, asegurémonos de que tengas claro qué es una ruta. Una ruta determina la ubicación de un elemento que sigue un formato específico.

Por ejemplo, la ruta de un archivo podría ser C:\demo\subfolder1\TestFile_11.txt. Si separas esta ruta en partes, la ruta incluye lo siguiente:

  • C: is the drive or the qualifier, or the specified path. The qualifier is the part of the path from the left up to the colon (:) character.
  • \demo\subfolder1\ es la carpeta y subcarpeta(s) o contenedores.
  • TestFile_11.txt es el nombre de archivo o la hoja. La hoja es el último elemento o parte de una ruta.

Recuerda, sin embargo, que las rutas no se limitan exclusivamente a archivos y carpetas. Otras rutas válidas pueden incluir:

  • Certificado (por ejemplo, Cert:\CurrentUser\My)
  • Registro (por ejemplo, HKCU:\Software)
  • Función (por ejemplo, Function:\New-Guid)
  • Variable (por ejemplo, Variable:\PSEdition)
  • Directorio Activo (por ejemplo, AD:\CN=Users,DC=Constoso,DC=com)

Los parámetros de Split-Path de PowerShell

Como cualquier cmdlet, Split-Path viene con un conjunto de parámetros que manipulan cómo se comporta el cmdlet y devuelve su salida. Y estos parámetros son los que conforman la sintaxis de Split-Path en PowerShell.

  • -Path – Este parámetro acepta una o más cadenas de ruta que deseas dividir. Este parámetro también acepta entrada de canalización. Los comodines en las rutas también son aceptables.
  • -LiteralPath – Al igual que el parámetro -Path, el parámetro -LiteralPath también acepta rutas para dividir. Pero este parámetro tratará la ruta tal como está escrita. Es decir, el comando no interpretará comodines si usas este parámetro para especificar rutas.
  • -Resolve – Este parámetro indica al cmdlet Split-Path que resuelva los archivos o elementos que son referenciados por la ruta que proporcionaste. Debido a su naturaleza literal, no puedes usar este parámetro junto con el parámetro -LiteralPath.
  • -IsAbsolute – Este parámetro devuelve un valor booleano para determinar si la ruta que especificaste es una ruta absoluta o no.

El cmdlet Split-Path de PowerShell también tiene un parámetro llamado -Credential, que supuestamente acepta un objeto PSCredential. Pero según Microsoft, este parámetro no es compatible con ninguno de los proveedores PowerShell integrados y genera un error al utilizarlo.

Los siguientes parámetros se denominan los Parámetros de Ubicación Dividida. Estos parámetros indican al cmdlet Split-Path de PowerShell qué elemento o parte de una ruta debe devolver. Dado que el cmdlet solo puede devolver un elemento de una ruta, solo puedes usar uno de estos parámetros a la vez.

  • -Parent – Devuelve la ubicación principal (sin el elemento o nombre de archivo) de la ruta que especificaste. Este parámetro también es el parámetro predeterminado de ubicación dividida, lo que significa que puedes omitir este parámetro y aún obtener la ubicación principal como resultado.
  • -Leaf – Devuelve solo el último elemento de la ruta o el elemento final.
  • -LeafBase – Devuelve solo el último elemento de la ruta o el elemento final sin la extensión. Este parámetro solo está disponible en PowerShell 6.0 y versiones posteriores.
  • -Extension: Devuelve solo la extensión de la hoja (desde el último punto “.” hasta el último carácter de la ruta). Este parámetro solo está disponible en PowerShell 6.0 y superior.
  • -Qualifier: Devuelve solo la unidad o calificador de la ruta.
  • -NoQualifier: Elimina la unidad o calificador del resto de la ruta.

Utilizando el cmdlet Split-Path de PowerShell (Ejemplos)

El cmdlet Split-Path de PowerShell te permite dividir y desglosar partes de una ruta. Después de hacerlo, puedes especificar qué parte de una ruta deseas devolver. Dependiendo de tus necesidades de salida, puedes optar por devolver el calificador, la ruta sin un calificador y el(los) nombre(s) de archivo.

Obteniendo la carpeta principal de una ruta

Para devolver la carpeta principal de la ruta, ejecuta el cmdlet Split-Path de PowerShell y añade el parámetro -Parent.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Parent

El resultado a continuación muestra que el comando devuelve la ruta de la carpeta principal.

Returning the parent containers of the Item

Consejo: Ejecutar el cmdlet Split-Path de PowerShell sin parámetros devolverá la carpeta principal por defecto, el mismo comportamiento que usar el parámetro -Parent.

Consejo: El parámetro -Path acepta múltiples rutas, lo que te permite dividir múltiples valores de cadenas de rutas en un solo comando.

e.g., Split-Path -Path 'c:\folder1','c:\folder2'

Mostrando una Ruta Sin el Calificador

Imagina que estás creando un script que duplica la estructura de árbol de carpetas de una unidad a otra (por ejemplo, C:\demo\subfolder1 a D:\demo\subfolder1). Es posible que desees que tu código divida la ruta de origen y obtenga solo la estructura de carpetas sin la letra de la unidad.

Para obtener la ruta sin el calificador, ejecuta el cmdlet Split-Path de PowerShell con el parámetro -NoQualifier como se muestra en el comando a continuación. Este comando divide la ruta mientras omite la letra de la unidad en el resultado.

Split-Path -Path C:\demo\subfolder1 -NoQualifier

Como puedes ver en el resultado a continuación, usar el parámetro noQualifier devuelve la ruta pero sin la cadena del calificador.

Returning the Path Without the Qualifier

Obtener la unidad o el calificador de una ruta

Puede haber momentos en los que necesites devolver solo el calificador o la letra de la unidad. Por ejemplo, cuando desees que tu script resuma los resultados según las letras de unidad.

Y para hacerlo, ejecuta el comando Split-Path de PowerShell a continuación con el parámetro -Qualifier. Este comando dividirá la ruta y devolverá solo la cadena del calificador como resultado.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Qualifier
Returning the Path’s Drive or Qualifier

Mostrar el nombre de un archivo, directorio o elemento

Imagina una ruta como un árbol. El calificador podría ser el árbol en sí, las carpetas son las ramas y al final encontrarás la hoja. Una hoja es cualquier cadena de longitud no nula al final de la ruta.

Cuando necesites dividir una ruta para obtener la hoja, ejecuta el comando Split-Path a continuación y añade el parámetro -Leaf.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Leaf

Como resultado, la imagen a continuación muestra que el comando solo devolvió el nombre de archivo de la ruta especificada.

Returning the Path’s Leaf

Dividiendo el nombre de archivo y la extensión (≥PowerShell 6.0)

Nota: Esta sección se aplica a PowerShell 6.0 y versiones posteriores.

Has dividido la ruta y has devuelto el elemento. Y el elemento, en este caso, es un nombre de archivo (TestFile_11.txt), que tiene dos partes: la base y la extensión. El cmdlet Split-Path de PowerShell te permite dividir aún más el nombre en estas dos partes con los parámetros -LeafBase y -Extension.

Para obtener la base y la extensión de un nombre de archivo, ejecuta los comandos a continuación.

Si la ruta no tiene una extensión, el parámetro Extension devolverá una cadena vacía.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -LeafBase
Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Extension
Splitting the Leaf’s Base and Extension

Dividiendo el nombre de archivo y la extensión (≤ Windows PowerShell 5.1)

Desafortunadamente, los parámetros -LeafBase y -Extension no están disponibles en Windows PowerShell 5.1 y versiones anteriores. No te preocupes, con algo de magia de PowerShell, puedes replicar la salida de estos parámetros incluso si solo tienes Windows PowerShell 5.1.

Pero en lugar del cmdlet Split-Path, usarás la siguiente mejor opción: la combinación del split() método y el -replace operador.

A PowerShell string object, such as the path, contains a split() method. This method allows you to split a string into multiple elements based on a delimiter character that you provide. And in the case of paths, the delimiter is the (\\) back-slash character.

Por otro lado, el operador -replace te permite reemplazar cadenas utilizando expresiones regulares (RegEx).

Para imitar los resultados del parámetro -LeafBase, ejecuta el siguiente comando en PowerShell.

# Divida la ruta ('C:\demo\subfolder1\TestFile_11.txt') utilizando '\' como delimitador.
# Seleccione el último elemento '[-1]' después de la división (TestFile_11.txt)
# Busque la cadena que coincida con este patrón --> '\.[^.]*$'
# ^ este patrón coincidirá con el último punto "." en la ruta Y cada otro carácter después de él.
# Luego reemplace la coincidencia con nada/valor vacío ''.
('C:\demo\subfolder1\TestFile_11.txt').split('\')[-1] -replace '\.[^.]*$',''

Como resultado, la captura de pantalla a continuación muestra que el comando devolvió solo el nombre base del archivo.

Getting the file base in PowerShell 5.1

Ahora, para obtener solo la extensión del archivo, ejecute el comando a continuación en PowerShell.

# Divida la ruta ('C:\demo\subfolder1\TestFile_11.txt') utilizando '.' como delimitador.
# Seleccione el último elemento '[-1]' después de la división (txt)
('C:\demo\subfolder1\TestFile_11.txt').split('.')[-1]

El resultado a continuación muestra que el comando devolvió solo la extensión del archivo – txt.

Getting the file extension in PowerShell ≤ 5.1

Determinando si la Ruta es Absoluta

Como administrador del sistema, encontrará dos tipos de rutas –absoluta y relativa. Pero ¿cuál es la diferencia? Una ruta absoluta comienza con un calificador, como C:\demo o HKCU:\Software. En contraste, una ruta relativa no tiene un calificador, como .\demo o \folder1\folder2.

El cmdlet Split-Path de PowerShell puede ayudarte a identificar una ruta absoluta utilizando el parámetro -IsAbsolute. Para hacerlo, ejecuta los siguientes comandos para determinar si la ruta es absoluta.

# Esta ruta es absoluta
Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -IsAbsolute
# Esta ruta es relativa
Split-Path -Path .\demo\subfolder1\TestFile_11.txt -IsAbsolute

Como puedes ver a continuación, el parámetro -isAbsolute devuelve un valor booleano para indicar si la ruta es absoluta (TRUE) o relativa (FALSE).

Determining if the Path is Absolute

División y Resolución de Rutas con Comodines

Hasta este punto, las rutas que divides con el cmdlet Split-Path no necesitan existir. Ya sea que una ruta exista o no, este cmdlet la dividirá y te dará el resultado.

Pero el cmdlet Split-Path de PowerShell tiene otro parámetro llamado -Resolve. Este parámetro te permite resolver los elementos referenciados por comodines. Y si utilizas este parámetro, la ruta que dividirás y los elementos dentro de ella deben existir previamente.

Por ejemplo, para devolver los elementos que coinciden con la extensión de archivo *.txt, ejecuta el siguiente comando. El parámetro -Leaf asegura que el cmdlet devuelva solo los elementos y no los contenedores principales.

El comodín (*) representa uno o más caracteres para que coincidan, mientras que (?) representa un comodín de un solo carácter.

Split-Path -Path C:\demo\subfolder1\*.txt -Leaf -Resolve

El resultado a continuación enumera los archivos TestFile_11.txt hasta TestFile_20.txt. Estos archivos todos coincidieron con la extensión de archivo .txt.

Resolving matching filenames

Para resolver una coincidencia de un solo carácter en su lugar, reemplace el comodín asterisco (*) con el comodín de interrogación (?), como se muestra en el comando a continuación.

Split-Path -Path C:\demo\subfolder1\TestFile_2?.txt -Resolve -Leaf

La salida a continuación muestra solo el archivo TestFile_20.txt porque este archivo es el único que coincidió.

Resolving matching single character

Si la ruta contiene un carácter de escape, como el acento grave (“`), encierre la ruta entre comillas simples para resolver la ruta. Por ejemplo, el comando a continuación divide y resuelve una ruta que contiene un carácter de escape.

Split-Path -Path 'C:\demo\subfolder1\dir`n\TestFile_2?.txt' -Leaf -Resolve
Splitting and Resolving a Path with Escape Characters

Como prueba de concepto, si no encierra esa ruta entre comillas simples, el comando devolverá un error de que la ruta no existe. El mismo error ocurre si usa comillas dobles en su lugar.

Split-Path -Path C:\demo\subfolder1\dir`n\TestFile_2?.txt -Leaf -Resolve
Split-Path -Path "C:\demo\subfolder1\dir`n\TestFile_2?.txt" -Leaf -Resolve
Resolving a Path without enclosing single quotation marks

Conclusión

El cmdlet Split-Path de PowerShell es una herramienta indispensable tanto para administradores de sistemas como para usuarios en general. Este tutorial tiene como objetivo enseñarle cómo el cmdlet Split-Path puede dividir cualquier ruta dada y devolver elementos específicos según el parámetro que use.

¿Has usado Split-Path en tus tareas anteriormente? Si no, ¿este tutorial te convenció de usarlo en tus tareas manuales o de automatización? ¿O conoces otra forma de dividir rutas mejor que el Split-Path de PowerShell?

Source:
https://adamtheautomator.com/powershell-split-path/