PowerShell Get-Content um Equivalente PowerShell Tail

Com a automação, a leitura de dados de um arquivo de texto é um cenário comum. A maioria das linguagens de programação possui pelo menos uma maneira de ler arquivos de texto, e o PowerShell não é exceção. O cmdlet Get-Content do PowerShell, equivalente ao tail do PowerShell, lê o conteúdo de um arquivo de texto e importa os dados para uma sessão do PowerShell.

O cmdlet Get-Content do PowerShell é uma ferramenta indispensável quando você precisa usar arquivos de texto como entrada para seu script. Talvez seu script do PowerShell precise ler uma lista de computadores para monitorar ou importar um modelo de email para enviar aos usuários. O Get-Content do PowerShell suporta facilmente esses cenários!

E que tal seguir um arquivo de log em tempo real? Sim, o Get-Content do PowerShell pode fazer isso também! Continue lendo este artigo e você aprenderá como usar o cmdlet Get-Content para ler arquivos de texto no PowerShell.

Pré-requisitos

Se você está interessado em seguir os exemplos deste tutorial, você precisará dos seguintes requisitos.

  • Você precisará de um computador com Windows 10. Este tutorial usa a versão 20H2 do Windows 10. Mas não se preocupe, você estará bem com a versão do Windows 10 que você tem.
  • Você deve ter pelo menos o Windows PowerShell 5.1, ou PowerShell 7.1 instalado no seu computador. Aqui é usada a versão 7.1 do PowerShell, mas qualquer uma das versões funcionará!
  • Você estará escrevendo e testando comandos, então precisará de um editor de código. Os editores recomendados são o Windows PowerShell ISE, integrado ao Windows, e o Visual Studio Code (VSCode). Este artigo utiliza o VSCode.
  • Também será útil se você criar um diretório de trabalho em seu computador. O diretório de trabalho pode estar em qualquer lugar que você desejar. No entanto, você perceberá que os exemplos neste tutorial estão no diretório C:\demo.
  • Para começar, você precisa de algum conteúdo! Crie um arquivo, no seu diretório de trabalho, com o nome frutas.txt que inclua dez frutas diferentes para simplicidade. Você usará este arquivo de texto em todos os exemplos.
cherry
 berry
 apricot
 papaya
 raspberry
 melon
 peach
 tangerine
 cantaloupe
 orange

Não sabe qual versão do PowerShell você tem? Visite o artigo Como Verificar a Versão do seu PowerShell (Todas as Formas!).

Lendo um Arquivo de Texto e Retornando o Resultado como uma Matriz de Strings

O cmdlet Get-Content lê o conteúdo de um arquivo e, por padrão, retorna cada linha de um arquivo de texto como um objeto de string. Como resultado, a coleção de objetos do PowerShell se torna uma matriz de objetos de string.

O código abaixo lê o conteúdo do arquivo frutas.txt e exibe o resultado no console do PowerShell, como visto na captura de tela abaixo.

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

Get-Content lê e armazena o conteúdo como uma matriz, mas como ter certeza disso? Primeiro, salve o conteúdo em um objeto do PowerShell que você pode examinar para determinar o 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

Olhando para a captura de tela abaixo, a variável $fruits é uma matriz que contém dez objetos. Cada objeto representa uma única linha de texto.

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

Retornando uma Linha Específica de um Arquivo de Texto

No exemplo anterior, você aprendeu que o resultado padrão do Get-Content é uma matriz ou uma coleção de objetos. Cada item na coleção corresponde a um número de índice, e os índices do PowerShell geralmente começam em zero.

A captura de tela abaixo mostra que há dez itens na matriz de strings. A matriz indexou os dez itens de zero a nove.

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

Para exibir apenas a quinta linha de conteúdo, você precisará especificar o número do índice 4, cercado por colchetes (conhecido como notação de matriz).

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

Você pode notar que o comando Get-Content está entre parênteses. Essa notação indica ao PowerShell para executar o comando entre parênteses primeiro antes de outras operações.

Na captura de tela abaixo, você verá que o único resultado retornado é raspberry, que é o item no índice 4 e corresponde à quinta linha no arquivo de texto.

Returning a specific line from Get-Content results.

E se você precisar obter o conteúdo na última linha? Felizmente, você não precisa saber o número total de linhas. Em vez disso, use [-1] como o índice, e o Get-Content exibirá apenas a última linha do arquivo.

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

Limitando o Número de Principais Resultados Retornados pelo Get-Content

Use o parâmetro TotalCount de Get-Content para recuperar um número especificado de linhas de um arquivo de texto. O parâmetro TotalCount aceita um valor longo, o que significa um valor máximo de 9.223.372.036.854.775.807.

Por exemplo, o comando abaixo lê o conteúdo e limita o resultado a três itens.

Get-Content .\fruits.txt -TotalCount 3

Como esperado, o resultado abaixo exibe apenas as três primeiras linhas do início do arquivo de texto.

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

Use o Parâmetro Tail do PowerShell para Retornar Resultados do Final de um Arquivo

No exemplo anterior, você usou o cmdlet Get-Content do PowerShell para ler um arquivo de texto e limitar os resultados superiores. Também é possível alcançar o oposto com o Get-Content do PowerShell. Use o parâmetro Tail do PowerShell para ler um número especificado de linhas do final de um arquivo.

O código de exemplo abaixo lê o arquivo de texto e exibe o conteúdo das últimas quatro linhas.

Get-Content .\fruits.txt -Tail 4

Após executar o comando tail do PowerShell, o resultado esperado será limitado às últimas quatro linhas de conteúdo, como mostrado na imagem abaixo.

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

O parâmetro Tail é frequentemente usado junto com o parâmetro Wait. Usar o parâmetro Wait mantém o arquivo aberto e verifica por novo conteúdo a cada segundo. A demonstração abaixo mostra os parâmetros Tail e Wait em ação. Para sair do Wait, use a combinação de teclas CTRL+C.

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

Retornando os resultados como uma única string

Você pode ter notado nos exemplos anteriores que lidou com matrizes de strings como saída do PowerShell Get-Content. E como aprendeu até agora, a natureza das matrizes permite que você opere no conteúdo um item de cada vez.

As matrizes geralmente funcionam bem, mas podem tornar a substituição de strings mais difícil. O parâmetro Raw do Get-Content lê todo o conteúdo de um arquivo em um único objeto de string. Embora o código abaixo seja o mesmo usado no primeiro exemplo, o parâmetro Raw armazena o conteúdo do arquivo como uma única string.

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

A captura de tela abaixo demonstra que adicionar o parâmetro Raw ao Get-Content resulta no tratamento do conteúdo como uma única string e não como uma matriz de objetos.

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

Depois de ter o conteúdo de um arquivo em uma única string usando o parâmetro Raw, o que você pode fazer com ele? Talvez você precise encontrar e substituir uma string dentro do conteúdo desse arquivo. No exemplo abaixo, Get-Content lê o conteúdo de um arquivo como uma única string. Em seguida, usando o operador replace, substitui uma palavra específica por outra.

Relacionado: Encontrando e Substituindo Strings

# Obtenha o conteúdo bruto do arquivo de texto
$fruits = Get-Content .\fruits.txt -Raw
# Exibir o conteúdo
$fruits
# Encontrar e substituir a palavra 'apricot' 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.

Leia o Conteúdo Apenas de Arquivos que Correspondam a um Filtro

Você tem uma pasta cheia de arquivos, mas precisa ler o conteúdo de apenas alguns selecionados? Com o PowerShell Get-Content, você não precisa filtrar os arquivos separadamente antes de ler o conteúdo deles. O parâmetro Filter do Get-Content limita quais arquivos o cmdlet lê.

Para demonstrar a leitura do conteúdo apenas de arquivos selecionados, primeiro, crie alguns arquivos para ler. Como mostrado abaixo, crie os arquivos na sua pasta de trabalho usando o Add-Content.

# Add-Content cria os arquivos log1.log e log2.log se eles ainda não existirem e adiciona o valor fornecido
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
# Verifique se os arquivos foram criados
Get-ChildItem C:\demo
Creating test .log files using Add-Content.

Com seus arquivos de teste criados, use os parâmetros Filter e Path para ler apenas arquivos .log no diretório raiz. O asterisco usado na definição do filtro indica ao Get-Content que leia qualquer arquivo que termine com .log. O asterisco final do parâmetro de caminho limita a leitura dos arquivos apenas ao diretório raiz.

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

Como mostrado na saída abaixo, apenas o conteúdo dos arquivos .log é exibido.

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

Relacionado: Get-ChildItem: Listando Arquivos, Registro, Certificados e Mais como Um

Lendo o Fluxo de Dados Alternativo de um Arquivo

Até agora, você tem trabalhado exclusivamente com arquivos de texto, mas o comando Get-Content pode ler dados do fluxo de dados alternativo (ADS) de um arquivo. Sinta-se à vontade para ler mais sobre fluxos, mas você pode pensar em um fluxo como outro atributo de dados armazenado junto com o conteúdo típico do arquivo.

Os fluxos de dados alternativos são uma característica do sistema de arquivos NTFS do Windows, portanto, isso não se aplica ao Get-Content quando usado em sistemas operacionais não-Windows.

Você pode ver os fluxos de dados alternativos executando o comando Get-Item com o parâmetro Stream. Ao referenciar um arquivo usando o parâmetro Stream, o Get-Item retorna uma propriedade chamada Stream, como mostrado abaixo. Este fluxo padrão de conteúdo de arquivo é representado por :$DATA.

Para demonstrar o fluxo padrão :$DATA, use o cmdlet Get-Item para exibir todos os fluxos disponíveis no arquivo frutas.txt. Como mostrado abaixo, o Get-Item exibe um único fluxo.

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

O parâmetro Stream do Get-Content lê explicitamente o conteúdo do fluxo padrão :$DATA, como mostrado abaixo. O conteúdo retornado é o mesmo que a saída padrão do Get-Content, pois o fluxo :$DATA é lido por padrão.

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

Para demonstrar a recuperação de um fluxo de dados alternativo usando Get-Content, modifique um arquivo usando Add-Content para adicionar o novo fluxo. Use Get-Item para mostrar o novo fluxo ao lado do fluxo padrão :$DATA, como visto no exemplo abaixo.

# Adicionar um novo ADS chamado Secret ao arquivo 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.

Como apenas o fluxo :$DATA é lido por padrão, use o parâmetro Stream do Get-Content para recuperar o conteúdo do novo fluxo Secret. Como mostrado abaixo, o conteúdo do fluxo Secret é exibido em vez do conteúdo padrão do arquivo.

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

Próximos Passos com PowerShell Get-Content

Neste artigo, você aprendeu muitas maneiras de usar Get-Content para ler e manipular conteúdo. Você até aprendeu que o Get-Content é flexível o suficiente para ler conteúdo de fluxos de dados alternativos!

Com o que você aprendeu neste artigo, que outras maneiras você pode usar Get-Content em seu trabalho? Talvez você possa usar o Get-Content para determinar se um arquivo de backup está desatualizado e acionar uma chamada automática para executar um trabalho de backup?

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