Cómo usar Substring en PowerShell

Cuando desee extraer una parte de una cadena en PowerShell, podemos usar el método Substring().

Este método nos permite especificar el inicio y la longitud de la subcadena que queremos extraer de una cadena.

En este artículo, explicaré cómo funciona el método Substring y le mostraré un par de ejemplos de cómo obtener partes de una cadena usando la función startIndex y/o length.

Uso del método Substring en PowerShell

El método Substring se puede usar en cualquier objeto de cadena en PowerShell. Puede ser una cadena literal o cualquier variable del tipo cadena.

Para usar el método necesitaremos especificar el punto de inicio de la cadena que queremos extraer.

Opcionalmente podemos especificar la longitud (número de caracteres), que queremos extraer.

Substring(startIndex, length)

Consejo

Tenga en cuenta que una cadena comienza en la posición 0 y no en la 1

Este método se explica mejor con la ayuda de ejemplos, así que comencemos con la siguiente cadena famosa «hola mundo».

Para extraer solo la palabra mundo de la cadena podemos usar el siguiente comando:

"Hello World".Substring(6)

# Result
World

Solo hemos especificado el punto de inicio de la subcadena, 6. De esta forma, el método extraerá todos los caracteres a partir de la posición 6 de la cadena.

Para explicar un poco mejor la posición de cada carácter, he numerado la posición debajo de cada letra de la cadena. Como puede ver, la posición 6 es la letra W.

Hello World
012345678910

Si sólo queremos extraer la palabra Hola de la cadena, entonces necesitamos especificar el índice de inicio de 0 y una longitud de 5 caracteres:

"Hello World".Substring(0,5)

# Result
Hello

Trabajar con cadenas dinámicas

Cuando trabaja con cadenas dinámicas, no siempre sabe la longitud de la cadena.

Para esto, podemos usar la función de longitud de cadena dentro del método de subcadena.

Digamos que tenemos una carpeta con archivos de registro de la que queremos extraer los nombres de archivo sin la extensión.

El nombre del archivo en sí puede tener diferentes longitudes, pero la extensión, en este caso, es de 3 letras y un punto.

Entonces, al mantener solo los nombres de archivo, podemos obtener la longitud del nombre de archivo y restarle 4 caracteres:

$filename = "la-ams-file02-log-1.log"

$filename.Substring(0, $filename.Length - 4)

# Result
la-ams-file02-log-1

También podemos usar esto al revés para obtener solo las extensiones de los nombres de archivo. Determinamos la posición de inicio en función de la longitud del nombre del archivo y especificamos una longitud de 3 caracteres:

$filename = "la-ams-file02-log-1.log"
$filename.Substring($filename.Length - 3, 3)

# Result
log

En este caso, en realidad no necesitamos especificar la longitud de la subcadena para devolver (3), porque simplemente podemos devolver los caracteres restantes:

$filename.Substring($filename.Length - 3)

# Result
log

Usando IndexOf en Subcadena

Cuando trabaja con longitudes de cadenas dinámicas, a veces desea extraer una parte en el medio de la cadena.

Entonces, el desafío es encontrar/calcular la posición inicial exacta para el método de subcadena.

Una opción para hacer esto es usar IndexOf. Este método le permite encontrar la posición de un carácter o cadena dentro de una cadena.

Volvamos a nuestro ejemplo de archivos de registro. Le he agregado un formato de fecha totalmente inútil, con una longitud inconsistente.

Para obtener solo la fecha del nombre de los archivos de registro, podemos usar el IndexOf() método.

Vamos a buscar en la cadena la parte única anterior a la fecha -log. El método IndexOf devolverá la posición inicial de la cadena o el carácter que buscaste, por lo que en este caso, necesitaremos agregarle 4 caracteres:

$files = @(
    'la-ams-ad01-log-202223.log',
    'la-ams-ad01-log-2022113.log',
    'la-osl-ad01-log-2022113.log',
    'la-osl-file01-log-202214.log'
)
$files | Foreach {
    # Get the position of the substring 'log-' in each filename and add 4 to this position.
    $part = $_.Substring($_.IndexOf('log-') + 4)
    # Returns 202223.log for example
 
    # Remove the extension from the substring
    $date = $part.Substring(0, $part.Length - 4)
    write-host $date
    # Returns 202223 for example
}

En este caso particular, también podrías usar el método LastIndexOf() en los guiones en los nombres de los archivos:

$files | Foreach {
    $part = $_.Substring($_.LastIndexOf('-') + 1)
    write-host $part

    $date = $part.Substring(0, $part.Length - 4)
    write-host $date
}

Terminando

Cuando trabaje con cadenas en PowerShell, probablemente usará bastante el método de subcadena.

Tenga en cuenta que siempre puede combinar el método de subcadena con otros operadores de cadena como dividir o reemplazar.

Espero que este artículo le haya resultado útil, si tiene alguna pregunta, simplemente deje un comentario a continuación.

Otros artículos relacionados

Encuentra direcciones de correo electrónico en Office 365 con PowerShell

Encuentra direcciones de correo electrónico en Office 365 con PowerShell

A veces necesita encontrar el usuario o un buzón que está usando una dirección de correo electrónico en particular. En ...
Leer Más
Eliminar carpetas vacías en SharePoint Online

Eliminar carpetas vacías en SharePoint Online

Después de fusionar carpetas duplicadas en SharePoint Online, necesitaba eliminar las carpetas vacías. Esto es algo que también podemos hacer ...
Leer Más
Personalizando la nueva Terminal de Windows

Personalizando la nueva Terminal de Windows

Normalmente empiezo un nuevo año limpiando mi escritorio, deshaciéndome de toda la basura que guardé en él durante los últimos ...
Leer Más
GUI de PowerShell - Cómo empezar

GUI de PowerShell – Cómo empezar

He creado muchos scripts de PowerShell durante los últimos años. Todo con un solo propósito para automatizar mi trabajo de ...
Leer Más
Cómo usar Test-NetConnection en PowerShell

Cómo usar Test-NetConnection en PowerShell

¿Sabías que el comando ping, con sus 38 años, es más antiguo que el símbolo del sistema? Probablemente ya haya ...
Leer Más
PowerShell Sleep - Cómo pausar su secuencia de comandos

PowerShell Sleep – Cómo pausar su secuencia de comandos

A veces, deberá pausar su secuencia de comandos de PowerShell durante un par de segundos. Por ejemplo, cuando está utilizando ...
Leer Más

Deja un comentario