Ler arquivo linha por linha no PowerShell

Eu quero ler um arquivo linha por linha no PowerShell. Especificamente, eu quero fazer um loop pelo arquivo, armazenar cada linha em uma variável do loop e fazer algum processamento na linha.

Eu sei o equivalente ao Bash:

while read line do
    if [[ $line =~ $regex ]]; then
          # work here
    fi
done < file.txt

Não há muita documentação sobre os loops PowerShell.

Solução

Não há muita documentação sobre os loops PowerShell.

A documentação sobre loops no PowerShell é abundante, e você pode querer verificar os seguintes tópicos de ajuda: sobre_For, sobre_ForEach, sobre_Do, sobre_Equando.

foreach($line in Get-Content .\file.txt) {
    if($line -match $regex){
        # Work here
    }
}

Outra solução idiomática PowerShell para o seu problema é canalizar as linhas do arquivo de texto para a ForEach-Object` cmdlet:

Get-Content .\file.txt | ForEach-Object {
    if($_ -match $regex){
        # Work here
    }
}

Ao invés de regexar a correspondência dentro do loop, você poderia canalizar as linhas através de Where-Object` para filtrar apenas aquelas em que você'está interessado:

Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
    # Work here
}
Comentários (3)

O Get-Content tem má performance; ele tenta ler o arquivo na memória de uma só vez.

O leitor de ficheiros C# (.NET) lê cada linha uma a uma

**Melhor desempenho***

foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt"))
{
       $line
}

Ou um pouco menos performante

[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object {
       $_
}

A declaração "para cada" será provavelmente um pouco mais rápida do que "Para cada objeto" (veja os comentários abaixo para mais informações).

Comentários (12)

O interruptor todo-poderoso funciona bem aqui:

'um
dois
três' > arquivo

$regex = '^t'

switch -regex -file file {
  $regex { "linha é $_" }
}

Saída:

linha é duas
linha é três
Comentários (0)