PowerShell Get-Content, un equivalente de PowerShell para Tail

Con la automatización, leer datos de un archivo de texto es un escenario común. La mayoría de los lenguajes de programación tienen al menos una forma de leer archivos de texto, y PowerShell no es una excepción. El cmdlet Get-Content de PowerShell, equivalente al comando tail de Unix, lee el contenido de un archivo de texto e importa los datos a una sesión de PowerShell.

El cmdlet Get-Content de PowerShell es una herramienta indispensable cuando necesitas usar archivos de texto como entrada para tu script. Tal vez tu script de PowerShell necesite leer una lista de computadoras para monitorear o importar una plantilla de correo electrónico para enviar a tus usuarios. ¡`Get-Content` de PowerShell admite fácilmente estos escenarios!

¿Qué tal seguir un archivo de registro en tiempo real? ¡Sí, el cmdlet Get-Content de PowerShell puede hacer eso también! Continúa leyendo este artículo y aprenderás cómo usar el cmdlet Get-Content para leer archivos de texto en PowerShell.

Prerrequisitos

Si estás interesado en seguir los ejemplos en este tutorial, necesitarás los siguientes requisitos.

  • Necesitarás una computadora que esté ejecutando Windows 10. Este tutorial utiliza la versión 20H2 de Windows 10. Pero no te preocupes, funcionará bien con la versión de Windows 10 que tengas.
  • Debes tener al menos Windows PowerShell 5.1, o PowerShell 7.1 instalado en tu computadora. Aquí se utiliza PowerShell 7.1, ¡pero cualquiera de las versiones funcionará!
  • Tendrás que escribir y probar comandos, así que necesitarás un editor de código. Los editores recomendados son Windows PowerShell ISE, que viene integrado en Windows, y Visual Studio Code (VSCode). Este artículo utiliza VSCode.
  • También será útil si creas un directorio de trabajo en tu computadora. La carpeta de trabajo puede estar en cualquier lugar que desees. Sin embargo, notarás que los ejemplos en este tutorial residen en la carpeta C:\demo.
  • ¡Para comenzar, necesitas algo de contenido! Crea un archivo en tu directorio de trabajo con el nombre fruits.txt, que incluya diez frutas diferentes para mayor simplicidad. Utilizarás este archivo de texto en todos los ejemplos.
cherry
 berry
 apricot
 papaya
 raspberry
 melon
 peach
 tangerine
 cantaloupe
 orange

¿No sabes qué versión de PowerShell tienes? Visita el artículo How to Check your PowerShell Version (All the Ways!).

Leer un archivo de texto y devolver el resultado como una matriz de cadenas

El cmdlet Get-Content lee el contenido de un archivo y, por defecto, devuelve cada línea de un archivo de texto como un objeto de cadena. Como resultado, la colección de objetos de PowerShell se convierte en una matriz de objetos de cadena.

El código siguiente lee el contenido del archivo fruits.txt y muestra el resultado en la consola de PowerShell, como se ve en la captura de pantalla a continuación.

Get-Content .\fruits.txt
Retrieving the text file content using PowerShell Get-Content.

Get-Content lee y almacena el contenido como una matriz, pero ¿cómo puedes estar seguro de eso? Primero, guarda el contenido en un objeto de PowerShell que luego puedes examinar para determinar el tipo.

Save the content into to a object
 $fruits = Get-Content .\fruits.txt
 Display the type of the object
 $fruits.GetType()
 Retrieve the count of items within the object
 $fruits.Count
 Output the contents of the object to the console
 $fruits

Al observar la captura de pantalla a continuación, la variable $fruits es un arreglo que contiene diez objetos. Cada objeto representa una sola línea de texto.

Confirming that the text file content is stored as an array.

Devolver una Línea Específica de un Archivo de Texto

En el ejemplo anterior, has aprendido que el resultado predeterminado de Get-Content es un arreglo o una colección de objetos. Cada elemento en una colección corresponde a un número de índice, y los índices de PowerShell típicamente comienzan en cero.

La captura de pantalla a continuación muestra que hay diez elementos en el arreglo de cadenas. El arreglo indexó los diez elementos del cero al nueve.

Showing that the indexed items in the string array start at zero index.

Para mostrar solo la quinta línea de contenido, necesitarás especificar el número de índice 4, encerrado entre corchetes (conocido como notación de arreglo).

(Get-Content .\fruits.txt)[4]

Puedes notar que el comando Get-Content está encerrado entre paréntesis. Esta notación indica a PowerShell que ejecute primero el comando encerrado entre paréntesis antes que otras operaciones.

En la captura de pantalla a continuación, verás que el único resultado devuelto es frambuesa, que es el elemento en el índice 4 y corresponde a la quinta línea en el archivo de texto.

Returning a specific line from Get-Content results.

¿Qué pasa si necesitas obtener el contenido en la última línea? Afortunadamente, no necesitas conocer el número total de líneas. En su lugar, usa [-1] como el índice, y Get-Content mostrará solo la última línea del archivo.

(Get-Content .\fruits.txt)[-1]

Limitar el Número de Principales Resultados Devueltos por Get-Content

Utilice el parámetro TotalCount de Get-Content para recuperar un número especificado de líneas de un archivo de texto. El parámetro TotalCount acepta un valor long, lo que significa un valor máximo de 9,223,372,036,854,775,807.

Por ejemplo, el comando a continuación lee el contenido y limita el resultado a tres elementos.

Get-Content .\fruits.txt -TotalCount 3

Como cabría esperar, el resultado que se muestra a continuación muestra solo las tres primeras líneas desde el principio del archivo de texto.

Reading the top three results using the Get-Content command and the TotalCount parameter.

Use el parámetro Tail de PowerShell para devolver resultados desde el final de un archivo

En el ejemplo anterior, utilizó el cmdlet Get-Content de PowerShell para leer un archivo de texto y limitar los resultados superiores. También es posible lograr lo contrario con Get-Content de PowerShell. Utilice el parámetro Tail de PowerShell para leer un número especificado de líneas desde el final de un archivo.

El código de ejemplo a continuación lee el archivo de texto y muestra el contenido de las cuatro últimas líneas.

Get-Content .\fruits.txt -Tail 4

Después de ejecutar el comando tail de PowerShell, el resultado esperado se limitará a las últimas cuatro líneas de contenido, como se muestra en la imagen a continuación.

Getting the results from the end of a file using the Get-Content Tail parameter.

El parámetro Tail se utiliza frecuentemente junto con el parámetro Wait. El uso del parámetro Wait mantiene el archivo abierto y verifica si hay contenido nuevo cada segundo. La demostración a continuación muestra los parámetros Tail y Wait en acción. Para salir de Wait, utilice la combinación de teclas CTRL+C.

Get-Content -Path .\fruits.txt -Tail 1 -Wait
Using the wait and Tail parameters with Get-Content.

Devolviendo los resultados como una sola cadena

Puede haber notado en ejemplos anteriores que ha estado tratando con matrices de cadenas como salida de Get-Content en PowerShell. Y como ha aprendido hasta ahora, la naturaleza de las matrices le permite operar sobre el contenido de a un elemento a la vez.

Las matrices a menudo funcionan muy bien, pero pueden dificultar la sustitución de cadenas. El parámetro Raw de Get-Content lee todo el contenido de un archivo en un único objeto de cadena. Aunque el código a continuación es el mismo que se usó en el primer ejemplo, el parámetro Raw almacena el contenido del archivo como una sola cadena.

Save the content into to a object
 $fruits = Get-Content .\fruits.txt -Raw
 Display the type of the object
 $fruits.GetType()
 Retrieve the count of items within the object
 $fruits.Count
 Output the contents of the object to the console
 $fruits

La captura de pantalla a continuación demuestra que al agregar el parámetro Raw a Get-Content, se trata el contenido como una sola cadena y no como una matriz de objetos.

Confirming that the Raw parameter of Get-Content reads the file content as a single string object.

Una vez que tiene el contenido de un archivo en una sola cadena usando el parámetro Raw, ¿qué puede hacer con él? Tal vez necesite encontrar y reemplazar una cadena dentro del contenido de ese archivo. En el ejemplo a continuación, Get-Content lee el contenido de un archivo como una sola cadena. Luego, usando el operador replace, se reemplaza una palabra específica por otra.

Relacionado: Encontrar y Reemplazar Cadenas

# Obtener el contenido en bruto del archivo de texto
$fruits = Get-Content .\fruits.txt -Raw
# Mostrar el contenido
$fruits
# Encontrar y reemplazar la palabra 'albaricoque' por 'mango'
$fruits -replace 'apricot','mango'
Reading the content of a text file as a single string and replacing a word using the replace operator.

Lee el contenido solo de archivos que coincidan con un filtro

¿Tienes una carpeta llena de archivos pero necesitas leer el contenido de solo algunos seleccionados? Con PowerShell Get-Content, no necesitas filtrar los archivos por separado antes de leer sus contenidos. El parámetro Filter de Get-Content limita los archivos que el cmdlet lee.

Para demostrar la lectura del contenido solo de archivos selectos, primero, crea un par de archivos para leer. Como se muestra a continuación, crea los archivos en tu carpeta de trabajo usando Add-Content.

# Add-Content crea los archivos log1.log y log2.log si aún no existen y agrega el valor dado
Add-Content -Value "This is the content in Log1.log" -Path C:\demo\Log1.log
Add-Content -Value "This is the content in Log2.log" -Path C:\demo\Log2.log
# Verifica que los archivos hayan sido creados
Get-ChildItem C:\demo
Creating test .log files using Add-Content.

Con tus archivos de prueba creados, utiliza los parámetros Filter y Path para leer solo los archivos .log en el directorio raíz. El asterisco utilizado en la definición del filtro indica a Get-Content que lea cualquier archivo que termine con .log. El asterisco al final del parámetro de ruta limita la lectura de archivos solo al directorio raíz.

Get-Content -Path C:\demo* -Filter *.log

Como se muestra en la salida a continuación, solo se muestra el contenido de los archivos .log.

Using the Filter parameter with PowerShell Get-Content to limit the read files.

Relacionado: Get-ChildItem: Listar archivos, registros, certificados y más como uno solo

Leyendo el Flujo de Datos Alternativo de un Archivo

Hasta ahora, has estado trabajando exclusivamente con archivos de texto, pero Get-Content puede leer datos del flujo de datos alternativo (ADS) de un archivo. Siéntete libre de leer más sobre los flujos, pero puedes pensar en un flujo como otro atributo de datos almacenado junto con el contenido típico del archivo.

Los flujos de datos alternativos son una característica del sistema de archivos NTFS de Windows, por lo tanto, esto no se aplica a Get-Content cuando se utiliza con sistemas operativos que no son Windows.

Puedes ver los flujos de datos alternativos ejecutando Get-Item con el parámetro Stream. Al referenciar un archivo utilizando el parámetro Stream, Get-Item devuelve una propiedad llamada Stream como se muestra a continuación. Este flujo de contenido de archivo predeterminado se representa con :$DATA.

Para demostrar el flujo :$DATA predeterminado, usa el cmdlet Get-Item para mostrar todos los flujos disponibles en el archivo fruits.txt. Como se muestra a continuación, Get-Item muestra un solo flujo.

Get-Item -Path .\fruits.txt -Stream *
Listing all available streams in a file using Get-Item.

El parámetro Stream de Get-Content lee explícitamente el contenido del flujo :$DATA predeterminado como se muestra a continuación. El contenido devuelto es el mismo que la salida predeterminada de Get-Content ya que el flujo :$DATA se lee por defecto.

Get-Content -Path .\fruits.txt -Stream ':$DATA'
Explicitly reading the :$DATA stream using Get-Content.

Para demostrar cómo recuperar un flujo de datos alternativo usando Get-Content, modifica un archivo usando Add-Content para agregar el nuevo flujo. Usa Get-Item para mostrar el nuevo flujo junto al flujo predeterminado :$DATA, como se ve en el siguiente ejemplo.

# Agrega un nuevo ADS llamado Secret al archivo fruits.txt
Add-Content -Path .\fruits.txt -Stream Secret -Value 'This is a secret. No one should find this.'
Get-Item -Path .\fruits.txt -Stream *
Adding the Secret alternate data stream using Add-Content and displaying the new stream with Get-Item.

Dado que solo se lee el flujo :$DATA de forma predeterminada, usa el parámetro Stream de Get-Content para recuperar el nuevo contenido del flujo Secret. Como se muestra a continuación, se muestra el contenido del flujo Secret en lugar del contenido predeterminado del archivo.

Get-Content -Path .\fruits.txt -Stream secret
Using Get-Content to read the Secret alternate data stream content.

Pasos siguientes con PowerShell Get-Content

En este artículo, has aprendido muchas formas de usar Get-Content para leer y manipular contenido. ¡Incluso has aprendido que Get-Content es lo suficientemente flexible como para leer contenido de flujos de datos alternativos!

Con lo que has aprendido en este artículo, ¿qué otras formas puedes usar Get-Content en tu trabajo? ¿Quizás puedas usar Get-Content para determinar si un archivo de respaldo está desactualizado y activar una llamada automática para ejecutar un trabajo de respaldo?

Source:
https://adamtheautomator.com/powershell-get-content/