Comparar Objetos com PowerShell (Guia Passo a Passo)

Com certeza, comparar arquivos ou conteúdos de arquivos no Windows é algo que você vem fazendo ao longo dos anos. Mas olhar para arquivos e conteúdos pode cansar seus olhos em algum momento? Bem, sorte para você, você pode comparar objetos com o PowerShell da maneira que desejar com o comando Compare-Object.

Neste tutorial, você aprenderá a comparar objetos com o PowerShell, como arquivos ou conteúdos de arquivos, personalizando a saída.

Poupe seus olhos do cansaço e compare objetos de forma eficaz!

Pré-requisitos

Este tutorial será uma demonstração prática, mas desde que você tenha um PC com Windows com o PowerShell, você está pronto para começar. A versão 5.1 do PowerShell é usada neste tutorial.

Comparando o Conteúdo do Arquivo

Imagine que você está mantendo dois arquivos diferentes com o mesmo conteúdo. Como você saberia se ambos os arquivos mantêm o mesmo conteúdo? Executar o comando Get-Content pode ser a solução. O comando Get-Content recupera o conteúdo de um arquivo de uma localização especificada.

Abra o PowerShell e execute os comandos abaixo para obter o conteúdo (Get-Content) dos arquivos especificados em variáveis ($file1 e $file2). Substitua o caminho abaixo pelo caminho dos arquivos escolhidos para comparar.

# Pegue o conteúdo dos arquivos de texto em variáveis
$file1 = Get-Content C:\\Temp\\File1.txt
$file2 = Get-Content C:\\Temp\\File2.txt
Storing Text File Contents to PowerShell Variables

Agora, execute o comando Compare-Object abaixo para comparar o conteúdo de $file (-ReferenceObject) com $file2 (-DifferenceObject).

Por padrão, Compare-Object não mostra os valores presentes em ambas as variáveis. Como solução, adicione o parâmetro -IncludeEqual para mostrar os valores na saída.

Compare-Object -ReferenceObject $file1 -DifferenceObject $file2 -IncludeEqual

No resultado abaixo, o SideIndicator indica se ambos os arquivos têm o mesmo conteúdo (por linha) ou não:

SideIndicator Definition
== Indicates the content is present in both files ($file1 and $file2).
=> Indicates the content only exists in the -DifferenceObject file ($file2).
=> Indicates the content only exists in the -ReferenceObject file ($file1).
Comparing File Contents

Talvez você prefira comparar strings com sensibilidade a maiúsculas e minúsculas. Se sim, adicione o parâmetro -CaseSensitive já que o comando Compare-Object não é sensível a maiúsculas e minúsculas por padrão.

Execute os comandos abaixo para comparar $file1 com $file2, tanto com quanto sem sensibilidade a maiúsculas e minúsculas.

# Comparando o conteúdo do arquivo com o parâmetro -CaseSensitive
Compare-Object $file1 $file2 -CaseSensitive
# Comparando o conteúdo do arquivo sem o parâmetro -CaseSensitive
Compare-Object $file1 $file2

Como você pode ver abaixo, sem o parâmetro -CaseSensitive, o comando Compare-Object não mostra powershell na saída.

Compare Objects wth PowerShell : Comparing File Contents with Case Sensitivity

Comparar strings também funciona de maneira semelhante à comparação de conteúdo de arquivos, onde você pode especificar as strings ou usar variáveis para representar as strings a serem comparadas. Lembre-se de que o comando Compare-Object compara strings de origem e não caracteres.

Comparando Listas de Arquivos de Locais Diferentes

Agora que você sabe como comparar o conteúdo de arquivos, por que não comparar arquivos reais de locais diferentes? Comparar listas de arquivos é útil quando você está gerenciando dois servidores diferentes onde mantém a mesma pasta para um serviço contendo os mesmos arquivos.

Desta vez, você usará o comando Get-ChildItem para obter a lista de arquivos em uma pasta para comparar com a lista de arquivos de outra pasta.

Execute os comandos abaixo para obter as listas de arquivos das pastas C:\Temp\Folder1\ e C:\Temp\Folder2 e armazenar as listas nas variáveis $Folder1List e $Folder2List.

# Captura a lista de nomes de arquivo em variáveis
$Folder1List = Get-ChildItem C:\\Temp\\Folder1\\
$Folder2List = Get-ChildItem C:\\Temp\\Folder2\\
# Comparando as listas
Compare-Object $Folder1List $Folder2List -IncludeEqual

Você também pode usar o parâmetro -Recurse no comando Get-Childitem para recuperar recursivamente uma lista de arquivos em subpastas.

Comparing Files in Different Folders

Comparar Objetos com PowerShell por Propriedades

Você acabou de comparar arquivos em diferentes locais, mas talvez queira adicionar outra opção para comparar arquivos por propriedades. E neste demo, você irá comparar arquivos pela hora do último acesso.

Execute os seguintes comandos para comparar arquivos de diferentes pastas ($Pasta1 e $Pasta2) pela hora do último acesso.

# Recuperar lista de arquivos de arquivos especificados
$Folder1 = Get-ChildItem C:\\Temp\\Folder1\\ -Recurse
$Folder2 = Get-ChildItem C:\\Temp\\Folder2\\ -Recurse
# Comparar arquivos pela última hora de acesso com nomes de arquivo
Compare-Object $Folder1 $Folder2 -Property name,lastaccesstime
Listing Compared Files using the lastaccesstime Parameter

Comparando Processos e Serviços

As capacidades do comando Compare-Object não estão limitadas apenas à comparação de strings ou conteúdo em arquivos. Você também pode comparar processos, serviços e assim por diante.

Talvez você queira capturar serviços entre dois servidores. Se sim, você pode armazenar os serviços em variáveis e compará-los.

Execute os seguintes comandos para comparar serviços entre dois servidores diferentes ($servidor1 e $servidor2).

# capturar a lista de serviços em variáveis
$server1 = Get-Service -ComputerName jumpbox
$server2 = Get-Service -ComputerName AD
# comparar serviços em ambos os servidores e classificá-los pelo nome do serviço
Compare-Object $server1 $server2 -PassThru | sort name| select name,status,machinename
Comparing Services Between Two Servers

Se você preferir comparar processos, os comandos a serem executados são semelhantes aos de comparação de serviços. Você também pode comparar processos na mesma máquina ou em dois servidores diferentes.

Execute os comandos abaixo para capturar os processos em execução de duas máquinas (Jumpbox e servidores AD) em variáveis e compará-los.

# Obter lista de processos dos servidores remotos em variáveis do PowerShell
$server1Process = Get-Process -ComputerName Jumpbox
$server2Process = Get-Process -ComputerName AD
# Comparar processos de dois servidores e listar nomes de processos e o nome correspondente do servidor na saída
Compare-Object $server1Process $server2Process -PassThru | sort name  |select name,machinename,sideindicator
Comparing Processes Between Two Servers

Identificação de Atividades ao Comparar Listas de Processos

O cmdlet Compare-Object também é útil em alguns cenários de solução de problemas. Como? Você pode capturar processos em execução atualmente em uma variável e iniciar sua atividade. Em seguida, capture os processos em execução em uma nova variável e compare os novos processos.

Execute os comandos abaixo para identificar atividades ao comparar duas listas diferentes de processos capturados.

# Capturar processos antes de iniciar sua atividade.
$Initial_Process = Get-Process
# Abrir o bloco de notas (sua atividade)
notepad
# Capturar processos após a conclusão de sua atividade.
$New_Process = Get-Process
# Comparação de Processos Iniciais e Novos
Compare-Object $Initial_Process $New_Process -PassThru | select processname,sideindicator
Identifying New Processes on Local PC

Comparando Usuários Entre Diferentes Grupos do Active Directory

Se você estiver gerenciando o mesmo conjunto de usuários de diferentes grupos do AD, comparar a lista de usuários com o comando Compare-Object será útil. Isso permite que você acompanhe de perto se um usuário está ausente de qualquer um dos dois grupos do AD diferentes.

Execute os comandos abaixo para comparar usuários entre dois grupos do AD diferentes (staticvmusers e vdivmusers).

# Importar o módulo Active Directory para executar os comandos Get-ADGroup e Get-ADUser.
Import-Module ActiveDirectory
# Armazenar a lista de usuários de diferentes grupos AD em variáveis.
$FirstGroup = Get-ADGroup staticvmusers -Properties Member |Select-Object -ExpandProperty Member | Get-ADUser
$SecondGroup = Get-ADGroup vdivmusers -Properties Member |Select-Object -ExpandProperty Member | Get-ADUser
# Executar o cmdlet compare-object para comparar usuários nesses dois grupos AD.
Compare-Object ($FirstGroup) ($SecondGroup) -Property 'SamAccountName' -IncludeEqual
Comparing Users in Two AD Groups

Conclusão

Neste tutorial, você aprendeu as nuances de como comparar objetos com o PowerShell de várias maneiras, desde conteúdo de arquivos até usuários em grupos AD. Percebeu que o cmdlet Compare-Object é uma solução rápida para comparar arquivos, serviços, processos, e muito mais.

Você adquiriu o conhecimento básico de como usar o cmdlet Compare-Object. Agora, que tal construir sobre esse conhecimento recém-descoberto, aprendendo arrays de comparação poderosos do PowerShell?

Source:
https://adamtheautomator.com/compare-objects-with-powershell/