Vraag Hoe dif ik twee tekstbestanden in Windows Powershell?


Ik heb twee tekstbestanden en wil de verschillen tussen beide vinden met behulp van Windows Powershell. Is er iets vergelijkbaar met de Unix diff-tool beschikbaar? Of is er nog een andere manier die ik niet heb overwogen?

Ik heb vergelijk-object geprobeerd, maar krijg deze cryptische uitvoer:

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

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

74
2018-05-07 03:37


oorsprong




antwoorden:


Ik heb het zelf bedacht. Omdat Powershell werkt met .net-objecten in plaats van tekst, moet u get-content gebruiken om de inhoud van de tekstbestanden bloot te leggen. Dus om te doen wat ik probeerde te doen in de vraag, gebruik:

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

80
2018-05-07 03:51



Ik was zeer verrast toen ik probeerde twee bestanden te vergelijken: een ongesorteerde reeks getallen en dezelfde reeks getallen na het sorteren ervan. Er is geen uitvoer, ondanks dat de bestanden erg verschillend zijn. Blijkbaar houdt compare-object geen rekening met de volgorde. - cgmb
@cgmb - U kunt gebruiken -SyncWindow 0 om dat op te lossen, denk ik, hoewel ik niet zeker weet of het pas onlangs is geïntroduceerd. Het is echter niet bijzonder slim. - James Ruskin


Of u zou de DOS kunnen gebruiken fc commando zoals zo (Dit toont de uitvoer van beide bestanden, dus je zult moeten zoeken naar de verschillen):

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

fc is een alias voor de cmdlet Format-Custom, dus zorg ervoor dat u de opdracht invoert als fc.exe. Houd er rekening mee dat veel DOS-hulpprogramma's geen UTF-8-codering verwerken.

Je kunt ook een CMD-proces uitproberen en uitvoeren fc erin.

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

Hiermee geeft u PowerShell de opdracht om een ​​proces te starten met het 'cmd'-programma met de parameters tussen aanhalingstekens. In de aanhalingstekens, is de '/ c' cmd optie om de opdracht uit te voeren en te beëindigen. De feitelijke opdracht die door cmd moet worden uitgevoerd, is fc filea.txt fileb.txt omleiden van de uitvoer naar het bestand diff.txt.

U kunt de DOS gebruiken fc.exe van binnen powershell.


27
2018-05-29 17:52



+1 voor het tevoorschijn halen van de DOS ^ _ ^ - Jeff Bridgman
"fc" werkte niet voor mij, en ik wist niet dat ik het moest specificeren als "fc.exe" om het te onderscheiden van Format-Custom. Precies wat ik zocht. Bedankt. - Xonatron
Misschien ben ik een complete filister, maar dit lijkt mij veel beter bruikbaar. Het loste mijn probleem heel goed op. - AJ.


Een eenvoudigere manier om dit te doen is om te schrijven:

diff (cat file1) (cat file2)

23
2017-12-12 19:15



Diff en cat zijn slechts aliassen voor Compare-Object en Get-Content in PowerShell. Het is hetzelfde ding. - Shawn Melton
ondanks dat dit hetzelfde is als het geaccepteerde antwoord, vind ik het leuk om deze syntaxis meer te gebruiken - Elijah W. Gagne


diff op * nix maakt geen deel uit van de shell, maar een afzonderlijke applicatie.

Is er een reden waarom u diff.exe niet alleen onder PowerShell kunt gebruiken?

U kunt een versie downloaden van het UnxUtils-pakket (http://unxutils.sourceforge.net/)


7
2018-05-07 03:56



Omdat PowerShell nu is inbegrepen, kan niets worden gedownload en geïnstalleerd. - Bratch
Ik heb het net gebruikt git diff, omdat ik het al had geïnstalleerd. Geen van beide fc.exe noch Compare-Object produceerde de output die ik verwachtte. - Raziel


vergelijk-object (alias diff alias) is zielig als je verwacht dat het zich zoiets als een unix diff gedraagt. Ik probeerde de diff (gc file1) (gc file2), en als een regel te lang is, kan ik de feitelijke diff niet zien en wat nog belangrijker is, ik kan niet zeggen welk regelnummer de diff is.

Wanneer ik probeer -passthru toe te voegen, kan ik nu het verschil zien, maar ik verlies welk bestand het verschil is en ik krijg nog steeds geen regelnummer.

Mijn advies, gebruik geen powershell om verschillen in bestanden te vinden. Zoals iemand anders opmerkte, fc werkt en werkt een beetje beter dan vergelijk-object, en nog beter is het downloaden en gebruiken van echte tools zoals de Unix-emulator die Mikeage noemde.


3
2018-02-18 18:19





WinMerge is een andere goede GUI-gebaseerde diff-tool.


2
2018-05-07 04:58



Dit is hoe ik het in het verleden deed, wat een handmatig proces is, dat ik wilde vervangen met een klein script. - Bratch


Zoals anderen hebben opgemerkt, zou je, als je een unix-y diff-uitvoer verwachtte, het gebruik van de powershell diff alias je in de steek laten. Om te beginnen moet je zijn hand vasthouden in het daadwerkelijk lezen van bestanden (met gc / get-content). Voor een ander is de verschilindicator rechts, ver van de inhoud - het is een nachtmerrie voor leesbaarheid.

De oplossing voor iedereen die op zoek is naar een gezonde output is

  1. krijg een echt verschil (bijv. van GnuWin32)
  2. bewerk% USERPROFILE% \ Documents \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1
  3. voeg de regel toe

    remove-item alias:diff -force
    

Het -force-argument is vereist omdat Powershell vrij kostbaar is over dit specifieke ingebouwde alias. Als iemand geïnteresseerd is, als GnuWin32 is geïnstalleerd, neem ik ook het volgende op in mijn powershell-profiel:

remove-item alias:rm
remove-item alias:mv
remove-item alias:cp

Vooral omdat Powershell geen argumenten begrijpt die samen worden uitgevoerd en worden getypt, bijvoorbeeld "rm -Force -Recurse" kost veel meer moeite dan "rm -rf".

Powershell heeft een aantal leuke functies, maar er zijn enkele dingen die het gewoon niet voor mij zou moeten doen.


2
2018-01-28 12:54





Er is ook Windiff die een GUI diff-interface biedt (ideaal voor gebruik met op de computer gebaseerde CVS / SVN-programma's)


1
2018-05-07 04:17