Confronta gli oggetti con PowerShell (Guida passo passo)

Certo abbastanza, confrontare file o contenuti di file in Windows è una cosa che hai fatto nel corso degli anni. Ma a un certo punto, non ti stanchi di guardare file e contenuti? Beh, per fortuna per te, puoi confrontare gli oggetti con PowerShell nel modo che desideri con il comando Compare-Object.

In questo tutorial, imparerai a confrontare gli oggetti con PowerShell, come file o contenuti di file, personalizzando l’output.

Risparmia gli occhi dalla fatica e confronta efficacemente gli oggetti!

Prerequisiti

Questo tutorial sarà una dimostrazione pratica, ma finché hai un PC Windows con PowerShell, sei pronto. La versione di PowerShell 5.1 viene utilizzata in questo tutorial.

Confrontare i Contenuti dei File

Immagina di avere due file diversi con lo stesso contenuto. Come sapresti se entrambi i file mantengono lo stesso contenuto? Eseguire il comando Get-Content può essere la soluzione. Il comando Get-Content recupera il contenuto di un file da una posizione specificata.

Apri PowerShell e esegui i comandi seguenti per ottenere il contenuto (Get-Content) dei file specificati nelle variabili ($file1 e $file2). Sostituisci il percorso sottostante con il percorso dei tuoi file scelti per il confronto.

# Prendi il contenuto dei file di testo nelle variabili
$file1 = Get-Content C:\\Temp\\File1.txt
$file2 = Get-Content C:\\Temp\\File2.txt
Storing Text File Contents to PowerShell Variables

Ora, esegui il comando Compare-Object di seguito per confrontare i contenuti di $file (-ReferenceObject) con $file2 (-DifferenceObject).

Per impostazione predefinita, Compare-Object non mostra i valori presenti in entrambe le variabili. Come soluzione, aggiungi il parametro -IncludeEqual per mostrare i valori nell’output.

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

Dall’output sottostante, il SideIndicator indica se entrambi i file hanno lo stesso contenuto (per riga) o meno:

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

Forse preferisci confrontare le stringhe con la sensibilità alle maiuscole e minuscole. In tal caso, aggiungi il parametro -CaseSensitive poiché il comando Compare-Object non è sensibile alle maiuscole e minuscole per impostazione predefinita.

Esegui i comandi seguenti per confrontare $file1 con $file2, sia con che senza sensibilità alle maiuscole e minuscole.

# Confronta i contenuti del file con il parametro -CaseSensitive
Compare-Object $file1 $file2 -CaseSensitive
# Confronta i contenuti del file senza il parametro -CaseSensitive
Compare-Object $file1 $file2

Come puoi vedere di seguito, senza il parametro -CaseSensitive, il comando Compare-Object non mostra powershell nell’output.

Compare Objects wth PowerShell : Comparing File Contents with Case Sensitivity

Confrontare le stringhe funziona anche in modo simile al confronto dei contenuti dei file, dove puoi specificare le stringhe o usare variabili per rappresentare le stringhe da confrontare. Tieni presente che il comando Compare-Object confronta le stringhe di origine e non i singoli caratteri.

Confronto delle liste di file da diverse posizioni

Ora che sai come confrontare i contenuti dei file, perché non confrontare file effettivi da posizioni diverse? Confrontare le liste di file è utile quando gestisci due server diversi dove mantieni la stessa cartella per un servizio contenente gli stessi file.

Questa volta, userai il comando Get-ChildItem per ottenere la lista dei file in una cartella da confrontare con la lista dei file di un’altra cartella.

Esegui i comandi seguenti per ottenere le liste dei file dalle cartelle C:\Temp\Folder1\ e C:\Temp\Folder2 e memorizzare le liste nelle variabili $Folder1List e $Folder2List.

# Cattura l'elenco dei nomi dei file nelle variabili
$Folder1List = Get-ChildItem C:\\Temp\\Folder1\\
$Folder2List = Get-ChildItem C:\\Temp\\Folder2\\
# Confronto delle liste
Compare-Object $Folder1List $Folder2List -IncludeEqual

Puoi anche utilizzare il parametro -Recurse nel comando Get-ChildItem per recuperare in modo ricorsivo un elenco di file nelle sottocartelle.

Comparing Files in Different Folders

Confronta gli oggetti con PowerShell per proprietà

Hai appena confrontato file in posizioni diverse, ma potresti voler aggiungere un’altra opzione per confrontare i file per proprietà. E in questa demo, confronti i file per lastaccesstime.

Esegui i seguenti comandi per confrontare i file da cartelle diverse ($Folder1 e $Folder2) per lastaccesstime.

# Recupera l'elenco dei file dai file specificati
$Folder1 = Get-ChildItem C:\\Temp\\Folder1\\ -Recurse
$Folder2 = Get-ChildItem C:\\Temp\\Folder2\\ -Recurse
# Confronta i file per lasttimeaccess con i nomi dei file
Compare-Object $Folder1 $Folder2 -Property name,lastaccesstime
Listing Compared Files using the lastaccesstime Parameter

Confronto di Processi e Servizi

Le capacità del comando Compare-Object non si limitano solo a confrontare stringhe o contenuti nei file. Puoi anche confrontare processi, servizi, e così via.

Forse vuoi catturare i servizi tra due server. In tal caso, puoi memorizzare i servizi in variabili e confrontare i servizi.

Esegui i seguenti comandi per confrontare i servizi tra due server diversi ($server1 e $server2).

# cattura l'elenco dei servizi in variabili
$server1 = Get-Service -ComputerName jumpbox
$server2 = Get-Service -ComputerName AD
# confronta i servizi su entrambi i server e ordinali in base al nome del servizio
Compare-Object $server1 $server2 -PassThru | sort name| select name,status,machinename
Comparing Services Between Two Servers

Se preferisci confrontare i processi, i comandi da eseguire sono simili a quelli per confrontare i servizi. Puoi anche confrontare i processi sulla stessa macchina o su due server diversi.

Esegui i seguenti comandi per catturare i processi in esecuzione da due macchine (Jumpbox e server AD) in variabili e confrontarli.

# Ottenere l'elenco dei processi dai server remoti nelle variabili PowerShell
$server1Process = Get-Process -ComputerName Jumpbox
$server2Process = Get-Process -ComputerName AD
# Confrontare i processi da due server e elencare i nomi dei processi e il nome del server corrispondente nell'output
Compare-Object $server1Process $server2Process -PassThru | sort name  |select name,machinename,sideindicator
Comparing Processes Between Two Servers

Identificare le attività confrontando gli elenchi dei processi

Il cmdlet Compare-Object è utile anche in alcuni scenari di risoluzione dei problemi. Come? Puoi acquisire i processi in esecuzione correntemente in una variabile e avviare la tua attività. Quindi acquisisci i processi in esecuzione in una nuova variabile e confronta i nuovi processi.

Esegui i comandi seguenti per identificare le attività confrontando due diverse liste di processi acquisiti.

# Acquisire i processi prima di avviare la tua attività.
$Initial_Process = Get-Process
# Aprire il blocco note (la tua attività)
notepad
# Acquisire i processi dopo che la tua attività è completata.
$New_Process = Get-Process
# Confronto dei processi iniziali e nuovi
Compare-Object $Initial_Process $New_Process -PassThru | select processname,sideindicator
Identifying New Processes on Local PC

Confrontare gli utenti tra diversi gruppi di Active Directory

Se stai gestendo lo stesso insieme di utenti da diversi gruppi AD, confrontare l’elenco degli utenti con il comando Compare-Object sarà utile. Così facendo ti permette di tenere sotto controllo se un utente è mancante da uno dei due diversi gruppi AD.

Esegui i comandi seguenti per confrontare gli utenti tra due diversi gruppi AD (staticvmusers e vdivmusers).

# Importa il modulo Active directory per eseguire i comandi Get-ADGroup e Get-ADUser.
Import-Module ActiveDirectory
# Memorizza l'elenco degli utenti dai diversi gruppi AD in variabili.
$FirstGroup = Get-ADGroup staticvmusers -Properties Member |Select-Object -ExpandProperty Member | Get-ADUser
$SecondGroup = Get-ADGroup vdivmusers -Properties Member |Select-Object -ExpandProperty Member | Get-ADUser
# Esegui il cmdlet compare-object per confrontare gli utenti in quei due gruppi AD.
Compare-Object ($FirstGroup) ($SecondGroup) -Property 'SamAccountName' -IncludeEqual
Comparing Users in Two AD Groups

Conclusione

In questo tutorial, hai imparato a confrontare oggetti con PowerShell in molti modi, dai contenuti dei file agli utenti nei gruppi AD. Hai realizzato che il cmdlet Compare-Object è una soluzione rapida per confrontare file, servizi, processi e così via.

Hai acquisito le conoscenze di base sull’uso del cmdlet Compare-Object. Ora, perché non costruire su questa nuova conoscenza imparando potenti confronti di array PowerShell?

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