fc.exe
è migliore per il confronto del testo poiché progettato per funzionare come * nix diff, ovvero confronta le linee in sequenza, mostrando le differenze effettive e cercando di risincronizzare (se le diverse sezioni hanno lunghezze diverse). Ha anche alcune utili opzioni di controllo (testo / binario, distinzione tra maiuscole e minuscole, numeri di riga, lunghezza della risincronizzazione, dimensioni del buffer di mancata corrispondenza) e fornisce lo stato di uscita (-1 sintassi errata, 0 file uguali, 1 file diverso, 2 file mancanti). Trattandosi di una (molto) vecchia utility DOS, presenta alcune limitazioni. In particolare, non funziona automaticamente con Unicode, trattando lo 0 MSB di caratteri ASCII come un terminatore di riga, quindi il file diventa una sequenza di 1 righe di caratteri (@kennycoc: utilizzare l'opzione / U per specificare ENTRAMBE i file sono Unicode, WinXP in poi ) e ha anche una dimensione del buffer di linea dura di 128 caratteri (128 byte ASCII,
compare-object è progettato per determinare se 2 oggetti sono identici per quanto riguarda i membri. se gli oggetti sono raccolte, vengono trattati come SET (consultare la guida di confronto-oggetto), ovvero raccolte NON ORDINATE senza duplicati. 2 set sono uguali se hanno gli stessi elementi membro indipendentemente dall'ordine o dalle duplicazioni. Ciò limita fortemente la sua utilità per il confronto dei file di testo per le differenze. In primo luogo, il comportamento predefinito raccoglie le differenze fino a quando l'intero oggetto (file = array di stringhe) non è stato verificato, perdendo così le informazioni sulla posizione delle differenze e oscurando quali differenze sono accoppiate (e non esiste un concetto di numero di riga per un SET di stringhe). L'uso di -synchwindow 0 farà sì che le differenze vengano emesse man mano che si verificano, ma ne impedisce il tentativo di risincronizzazione, quindi se un file ha una linea in più, i successivi confronti di linea possono fallire anche se i file sono altrimenti identici (fino a quando non c'è un compenso linea aggiuntiva nell'altro file riallineare le linee corrispondenti). Tuttavia, PowerShell è estremamente versatile e un utile confronto dei file può essere fatto utilizzando questa funzionalità, anche se a costo di una sostanziale complessità e con alcune restrizioni sul contenuto dei file. Se devi confrontare i file di testo con linee lunghe (> 127 caratteri) e dove le linee corrispondono principalmente a 1:
diff (gc file1 | % -begin { $ln1=0 } -process { '{0,6}<<:{1}' -f ++$ln1,$_ }) (gc file2 | % -begin { $ln2=0 } -process { '{0,6}>>:{1}' -f ++$ln2,$_ }) -property { $_.substring(9) } -passthru | sort | out-string -width xx
dove xx è la lunghezza della linea più lunga + 9
Spiegazione
(gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })
ottiene il contenuto del file e antepone il numero di riga e l'indicatore del file (<< o >>) a ciascuna riga (utilizzando l'operatore stringa di formato) prima di passarlo a diff.
-property { $_.substring(9) }
dice a diff di confrontare ogni coppia di oggetti (stringhe) ignorando i primi 9 caratteri (che sono il numero di riga e l'indicatore del file). Questo utilizza la possibilità di specificare una proprietà calcolata (il valore di un blocco di script) anziché il nome di una proprietà.
-passthru
fa sì che diff generi in output i diversi oggetti di input (che includono il numero di riga e l'indicatore del file) invece dei diversi oggetti confrontati (che non lo fanno).
sort-object
quindi riporta tutte le linee in sequenza.
out-string arresta il troncamento predefinito dell'output per adattarlo alla larghezza dello schermo (come notato da Marc Towersap) specificando una larghezza abbastanza grande da evitare il troncamento. Normalmente, questo output verrebbe inserito in un file che verrà quindi visualizzato usando un editor a scorrimento (ad es. Blocco note).
Nota
Il formato del numero di riga {0,6} fornisce un numero di riga di 6 caratteri con spazio giustificato a destra (per l'ordinamento). Se i file hanno più di 999.999 righe, cambia semplicemente il formato in modo che sia più ampio. Ciò richiede anche la modifica del $_.substring
parametro (3 in più rispetto alla larghezza del numero di riga) e il valore xx della stringa esterna (lunghezza massima della riga + $_.substring
parametro).