180 votes

Comment différencier deux fichiers texte dans Windows Powershell ?

J'ai deux fichiers texte et je veux trouver les différences entre eux en utilisant Windows Powershell. Existe-t-il quelque chose de similaire à l'outil diff d'Unix ? Ou existe-t-il un autre moyen auquel je n'ai pas pensé ?

J'ai essayé de comparer les objets, mais j'obtiens ce résultat cryptique :

PS C:\> compare-object one.txt two.txt

InputObject                                                 SideIndicator
-----------                                                 -------------
two.txt                                                     =>
one.txt                                                     <=

188voto

gil Points 828

J'ai trouvé la solution moi-même. Comme Powershell travaille avec des objets .net plutôt qu'avec du texte, vous devez utiliser get-content pour exposer le contenu des fichiers texte. Donc pour réaliser ce que j'essayais de faire dans la question, utilisez :

compare-object (get-content one.txt) (get-content two.txt)

6 votes

J'ai été très surpris lorsque j'ai essayé de comparer deux fichiers : un tableau de chiffres non triés, et le même tableau de chiffres après les avoir triés. Il n'y a pas de résultat alors que les fichiers sont très différents. Apparemment, compare-objet ne tient pas compte de l'ordre.

3 votes

@cgmb - Vous pouvez utiliser -SyncWindow 0 pour résoudre ce problème, je crois, mais je ne suis pas sûr qu'il ait été introduit récemment. Il n'est pas particulièrement intelligent à ce sujet, cependant.

2 votes

Notez que cette méthode est terriblement lente lors de la comparaison de gros fichiers. DOS fc.exe ou *nix diff il y a de meilleures options.

80voto

Alex Y. Points 691

Une façon plus simple de le faire est d'écrire :

diff (cat file1) (cat file2)

33 votes

Diff et cat ne sont que des alias pour Compare-Object et Get-Content dans PowerShell. Il s'agit de la même chose.

12 votes

Bien que ce soit la même chose que la réponse acceptée, j'aime mieux utiliser cette syntaxe

6 votes

Notez qu'il ne se comporte pas comme *nix diff du tout, comme le notent d'autres réponses ici. Et quand j'ai utilisé une expression plus complexe à la place de cat J'ai obtenu des résultats incorrects, je vais donc me joindre aux autres pour recommander d'éviter de faire cela dans PowerShell si vous venez de *nix.

48voto

phord350 Points 369

Ou vous pouvez utiliser le DOS fc comme suit (Ceci montre la sortie des deux fichiers, vous devrez donc rechercher les différences) :

fc.exe filea.txt fileb.txt > diff.txt

fc est un alias pour la cmdlet Format-Custom. Veillez donc à entrer la commande en tant que fc.exe . Veuillez noter que de nombreux utilitaires DOS ne gèrent pas l'encodage UTF-8.

Vous pouvez aussi lancer un processus CMD et exécuter fc en son sein.

start cmd "/c  ""fc filea.txt fileb.txt >diff.txt"""

Ceci indique à PowerShell de lancer un processus avec le programme 'cmd' en utilisant les paramètres entre guillemets. Entre les guillemets, se trouve l'option cmd '/c' pour exécuter la commande et la terminer. La commande réelle à exécuter par cmd dans le processus est la suivante fc filea.txt fileb.txt redirigeant la sortie vers le fichier diff.txt .

Vous pouvez utiliser le DOS fc.exe à partir de powershell.

4 votes

+1 pour avoir sorti le DOS ^_^

1 votes

"fc" ne fonctionnait pas pour moi, et je n'avais pas réalisé que je devais le spécifier comme "fc.exe" pour le différencier de Format-Custom. C'est exactement ce que je cherchais. Merci.

1 votes

Je suis peut-être un philistin complet, mais cela me semble beaucoup plus utilisable. Il a résolu mon problème de manière très satisfaisante.

10voto

Mikeage Points 2731

Diff sur *nix ne fait pas partie du Shell, mais une application séparée.

Y a-t-il une raison pour laquelle vous ne pouvez pas utiliser diff.exe sous PowerShell ?

Vous pouvez télécharger une version depuis le paquetage UnxUtils ( http://unxutils.sourceforge.net/ )

12 votes

Parce que PowerShell est inclus maintenant, rien à télécharger et à installer.

4 votes

J'ai juste fini par utiliser git diff parce que je l'avais déjà installé. Ni l'un ni l'autre fc.exe ni Compare-Object a produit le résultat que j'attendais.

0 votes

Je préfère ne pas télécharger les utilitaires essentiels d'un développeur qui non seulement utilise un format de date ambigu, mais passe également d'un format à l'autre dans la même liste (Quoi de neuf : 28/10/00... 27-06-03...). Microsoft aime peut-être Linux mais pas ses utilitaires essentiels...

9voto

Charlie Points 929

Compare-objet (alias diff) est pathétique si vous vous attendez à ce qu'il se comporte comme un diff unix. J'ai essayé le diff (gc file1) (gc file2), et si une ligne est trop longue, je ne peux pas voir le diff réel et plus important, je ne peux pas dire sur quel numéro de ligne se trouve le diff.

Lorsque j'essaie d'ajouter -passthru, je peux maintenant voir la différence, mais je perds le fichier dans lequel se trouve la différence, et je n'obtiens toujours pas de numéro de ligne.

Mon conseil, n'utilisez pas powershell pour trouver des différences dans les fichiers. Comme quelqu'un d'autre l'a noté, fc fonctionne, et fonctionne un peu mieux que compare-objet, et encore mieux est de télécharger et d'utiliser de vrais outils comme l'émulateur unix que Mikeage a mentionné.

0 votes

Il semble également effectuer une comparaison d'ensemble (c'est-à-dire sans tenir compte de l'ordre) comme suit -SyncWindow est maxint par défaut. Le mettre à 0 ne permet pas d'obtenir le même résultat. diff non plus... Et quand j'ai passé une pipe (... | select-object ...) comme entrée, ça a juste imprimé des absurdités, alors j'ai abandonné.

0 votes

Compare-Object n'est pas pathétique, il est destiné à "comparer deux ensembles d'objets" (voir Get-Help Compare-Object | more ). Ce n'est pas ce que vous essayez de faire. En ce qui concerne la sortie coupée, les commandes PowerShell renvoient des objets qui peuvent être scriptées/pipées sans analyse. Si vous êtes intéressé par la sortie de texte, consultez la section Format-* cmdlets ou pipe vers votre éditeur préféré et obtenir les numéros de ligne que vous voulez.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X