¿Cómo leer un archivo línea por línea en PowerShell?
En PowerShell, recientemente, recibí el requisito de leer un archivo de texto línea por línea. Existen varios métodos para hacer esto. En este tutorial de PowerShell, explicaré varios métodos para leer un archivo línea por línea usando PowerShell con ejemplos y scripts completos.
Para leer un archivo línea por línea en PowerShell, puede usar el cmdlet Get-Content combinado con un bucle foreach, que lee el contenido del archivo y recorre cada línea. Para archivos grandes, considere usar el método [System.IO.File]::ReadLines o un objeto [System.IO.StreamReader] para leer líneas secuencialmente sin cargar todo el archivo en la memoria, conservando así los recursos del sistema. Aquí hay un ejemplo conciso usando Get-Content:
Get-Content -Path "C:\MyFolder\file.txt" | foreach { Write-Output $_ }Método 1: uso de Get-Content y un bucle Foreach
La forma más sencilla de leer un archivo línea por línea en PowerShell es utilizar el cmdlet Get-Content en combinación con un bucle foreach.
El cmdlet Get-Content de PowerShell lee el contenido de un archivo y lo devuelve línea por línea de forma predeterminada.
He aquí un ejemplo sencillo:
$fileContent = Get-Content -Path "C:\MyFolder\file.txt"
foreach ($line in $fileContent) {
# Process each line
Write-Output $line
}
En este script, Get-Content recupera cada línea de file.txt y la almacena en la variable $fileContent. El bucle foreach luego itera sobre cada línea y Write-Output la muestra en la consola.
Una vez que ejecute el script de PowerShell, podrá ver el resultado como en la siguiente captura de pantalla:
Método 2: transmisión de contenido de archivos
Si está trabajando con archivos grandes en PowerShell, es posible que desee transmitir el contenido del archivo para evitar cargar todo el archivo en la memoria. Esto se puede hacer canalizando la salida de Get-Content directamente a un bucle foreach:
Get-Content -Path "C:\MyFolder\largefile.txt" -Stream | foreach {
# Process each line
Write-Output $_
}Aquí, $_ representa la línea actual en la canalización, lo que le permite trabajar con ella directamente sin almacenar todo el contenido del archivo en una variable.
Método 3: uso del cmdlet ForEach-Object
Otro enfoque implica canalizar la salida de Get-Content directamente a ForEach-Object, lo que le permite procesar cada línea dentro de la canalización en PowerShell:
Get-Content -Path "C:\MyFolder\file.txt" | ForEach-Object {
# Process each line
Write-Host $_
}En este ejemplo, $_ representa el objeto actual en la canalización, que es la línea actual que se está procesando.
Aquí está el resultado:
Método 4: usar [System.IO.File]::ReadLines()
Para archivos grandes, es más eficiente usar el método [System.IO.File]::ReadLines(), que lee el archivo de forma perezosa, lo que significa que solo lee líneas en la memoria cuando son necesarias.
Ejemplo :
[System.IO.File]::ReadLines("C:\path\to\your\file.txt") | ForEach-Object {
# Process each line
Write-Host $_
}Este método es particularmente útil para procesar archivos muy grandes sin consumir mucha memoria.
Método 5: usar Stream Reader
Si necesita más control sobre el proceso de lectura de archivos, puede utilizar un objeto StreamReader en PowerShell. Esta también es una buena opción para archivos grandes.
Ejemplo :
$streamReader = [System.IO.StreamReader] "C:\MyFolder\file.txt"
try {
while ($streamReader.Peek() -ge 0) {
$line = $streamReader.ReadLine()
# Process each line
Write-Host $line
}
}
finally {
$streamReader.Close()
}Este script crea un objeto StreamReader para el archivo y lee cada línea en un bucle while hasta que no queden más líneas para leer. Es importante cerrar StreamReader con el método Close() cuando haya terminado para liberar recursos.
Método 6: usar la declaración de cambio
La declaración de cambio de PowerShell también se puede utilizar para leer un archivo línea por línea.
Aquí hay un ejemplo simple:
switch -File "C:\MyFolder\file.txt" {
default {
# Process each line
Write-Host $_
}
}La instrucción switch lee el archivo y procesa cada línea a medida que avanza, usando $_ para hacer referencia a la línea actual.
Ejemplo real
Aquí hay un script completo que lee un archivo de registro y extrae líneas que contienen la palabra "Error" en PowerShell:
$logFilePath = "C:\MyFolder\log.txt"
$errorLines = @()
Get-Content -Path $logFilePath | ForEach-Object {
if ($_ -match "Error") {
$errorLines += $_
}
}
# Output error lines to a new file
$errorLogPath = "C:\NewFolder\error_log.txt"
$errorLines | Out-File -FilePath $errorLogPath
Write-Host "Error lines extracted to $errorLogPath"Este script lee un archivo de registro, filtra las líneas que contienen "Error" y escribe esas líneas en un nuevo archivo de registro de errores.
Conclusión
La lectura de un archivo línea por línea en PowerShell se puede lograr mediante varios métodos:
- Usando Get-Content y un bucle Foreach
- Transmisión de contenido de archivos
- Uso del cmdlet ForEach-Object
- Usando [System.IO.File]::ReadLines()
- Usando el lector de secuencias
- Usando la declaración de cambio
Ya sea que esté procesando archivos pequeños o grandes, PowerShell le proporciona diferentes formas de leer un archivo línea por línea en PowerShell.

