Comparar Objetos com PowerShell (Guia Passo a Passo)

Claro o suficiente, comparar arquivos ou conteúdos de arquivos no Windows é algo que você tem feito ao longo dos anos. Mas será que observar arquivos e conteúdos não cansa seus olhos em algum momento? Bem, por sorte, 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.

Economize seus olhos da fadiga e compare objetos de maneira eficaz!

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

Comparando Conteúdos de Arquivos

Imagine que você está mantendo dois arquivos diferentes com o mesmo conteúdo. Como 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.

# Obter 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 $file1 (-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

A partir da saída 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 prefira comparar strings com sensibilidade a maiúsculas e minúsculas. Se sim, acrescente 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. Tenha em mente 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 diferentes locais? Comparar listas de arquivos é útil quando você está gerenciando dois servidores diferentes nos quais você 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 e 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 arquivos 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 pode querer adicionar outra opção para comparar arquivos por propriedades. E neste demo, você irá comparar arquivos pelo último acesso.

Execute os seguintes comandos para comparar arquivos de diferentes pastas ($Folder1 e $Folder2) pelo último acesso.

# Obtenha lista de arquivos de arquivos especificados
$Folder1 = Get-ChildItem C:\\Temp\\Folder1\\ -Recurse
$Folder2 = Get-ChildItem C:\\Temp\\Folder2\\ -Recurse
# Compare arquivos por último tempo 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 se limitam apenas a comparar 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 comparar os serviços.

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

# capture a lista de serviços em variáveis
$server1 = Get-Service -ComputerName jumpbox
$server2 = Get-Service -ComputerName AD
# compare serviços em ambos os servidores e ordene-os 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 à 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 processos em execução de duas máquinas (Jumpbox e servidores AD) em variáveis e compará-los.

# Obter lista de processos de 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 através da Comparação de Listas de Processos

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

Execute os comandos abaixo para identificar atividades comparando 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
# Comparando Processo Inicial e Novo
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ê fique atento se um usuário está ausente de qualquer um dos dois grupos diferentes do AD.

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

# Importe o módulo Active Directory para executar os comandos Get-ADGroup e Get-ADUser.
Import-Module ActiveDirectory
# Armazene 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
# Execute 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 os conceitos básicos de como comparar objetos com o PowerShell de várias maneiras, desde conteúdos de arquivos até usuários em grupos AD. Você percebeu que o cmdlet Compare-Object é uma solução rápida para comparar arquivos, serviços, processos e assim por diante.

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

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