fc.exe
est préférable pour la comparaison de texte car il est conçu pour fonctionner comme * nix diff, c'est-à-dire compare les lignes séquentiellement, en montrant les différences réelles et en essayant de se resynchroniser (si les sections différentes ont des longueurs différentes). Il dispose également de quelques options de contrôle utiles (texte / binaire, respect de la casse, numéros de ligne, longueur de resynchronisation, taille du tampon incohérent) et fournit le statut de sortie (syntaxe -1 incorrecte, 0 fichier identique, 1 fichier différent, 2 fichier manquant). Étant un (très) ancien utilitaire DOS, il a quelques limitations. Plus particulièrement, il ne fonctionne pas automatiquement avec Unicode, il traite le caractère 0 MSB de caractères ASCII comme un séparateur de ligne, de sorte que le fichier devient une séquence de 1 caractère (@kennycoc: utilisez l’option / U pour spécifier que les deux fichiers sont Unicode, WinXP, etc. ) et possède également une taille de tampon de ligne dure de 128 caractères (ASCII 128 octets,
compare-object est conçu pour déterminer si 2 objets sont identiques au niveau des membres. si les objets sont des collections, ils sont traités comme des SETS (voir help compare-object), c'est-à-dire des collections UNORDERED sans doublons. 2 jeux sont égaux s'ils ont les mêmes articles de membre indépendamment de l'ordre ou des duplications. Cela limite considérablement son utilité pour comparer des fichiers texte aux différences. Tout d’abord, le comportement par défaut collecte les différences jusqu’à ce que l’objet entier (fichier = tableau de chaînes) ait été vérifié, perdant ainsi les informations relatives à la position des différences et masquant les différences appariées (et aucune notion de numéro de ligne pour un SET). de chaînes). Si vous utilisez -synchwindow 0, les différences sont émises au fur et à mesure qu'elles se produisent, mais l'empêchent d'essayer de se resynchroniser. Ainsi, si un fichier comporte une ligne supplémentaire, les comparaisons de ligne suivantes peuvent échouer même si les fichiers sont identiques (jusqu'à ce qu'il y ait compensation). ligne supplémentaire dans l’autre fichier, réalignant ainsi les lignes correspondantes). Cependant, powershell est extrêmement polyvalent et une comparaison de fichiers utile peut être réalisée à l'aide de cette fonctionnalité, bien que cela se fasse au prix d'une complexité considérable et de certaines restrictions sur le contenu des fichiers. Si vous devez comparer des fichiers texte comportant de longues lignes (> 127 caractères) et dont les lignes correspondent généralement à 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
où xx est la longueur de la plus longue ligne + 9
Explication
(gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })
récupère le contenu du fichier et ajoute le numéro de ligne et l'indicateur de fichier (<< ou >>) à chaque ligne (à l'aide de l'opérateur de chaîne de formatage) avant de le transmettre à diff.
-property { $_.substring(9) }
indique à diff de comparer chaque paire d'objets (chaînes) en ignorant les 9 premiers caractères (qui sont le numéro de ligne et l'indicateur de fichier). Cela utilise la possibilité de spécifier une propriété calculée (la valeur d'un bloc de script) au lieu du nom d'une propriété.
-passthru
fait en sorte que diff produise les objets d'entrée différents (qui incluent le numéro de ligne et l'indicateur de fichier) au lieu des objets comparés différents (qui ne le font pas).
sort-object
puis remet toutes les lignes en séquence.
out-string arrête la troncature par défaut de la sortie pour l'adapter à la largeur de l'écran (comme l'a noté Marc Towersap) en spécifiant une largeur suffisamment grande pour éviter la troncature. Normalement, cette sortie serait placée dans un fichier qui est ensuite visualisé à l'aide d'un éditeur de défilement (par exemple, le bloc-notes).
Remarque
Le format de numéro de ligne {0,6} donne un numéro de ligne à 6 caractères, complété par des espaces et assorti d'espaces (pour le tri). Si les fichiers ont plus de 999 999 lignes, changez simplement le format pour qu’il soit plus large. Cela nécessite également de modifier le $_.substring
paramètre (3 de plus que la largeur du numéro de ligne) et la valeur de sortie xx (longueur de ligne maximale + $_.substring
paramètre).