Wie kann man überprüfen, ob zwei Dateien innerhalb eines Windows-Shell-Skripts identisch sind?

1288
Jasper

Ich schreibe ein Shell-Skript unter Verwendung der Windows NT (ish) Shell-Skriptsprache. (Mein Computer hat Windows 10.) Ich möchte prüfen, ob zwei Textdateien identisch sind. Wenn die Dateien identisch sind, möchte ich, dass mein Skript eine Sache ausführt. Wenn die Dateien nicht identisch sind, möchte ich, dass mein Skript etwas anderes tut. Das Skript sollte nicht pausieren, um die manuelle Eingabe weiterer Daten anzufordern.

Die Liste "Ähnliche Fragen" enthält Fragen zu Macintosh- und Bash-Shell-Skripts. Es hat auch eine Antwort zum Ausführen fcoder compvon der Befehlszeile, die eine ausführliche Ausgabe liefern. Gibt leider fckein Ergebnis an %errorlevel%und comp fragt nach der manuellen Dateneingabe, anstatt es einfach zu beenden.

Ich habe eine Kopie von Tim Hills Buch über Windows NT-Shell-Skripte. Page 216 enthält die folgende Codezeile, wo %D1%und %D2%sind Verzeichnisse, aber ich weiß nicht, wie ich es ändern kann, um nur ein einziges Paar von Dateien zu bearbeiten:

for /f "tokens=*" %%I in ('fc /b %D1%\*.* %D2%\*.* ^| find /v "Comparing" ^| find /v "FC: no*"') do (set /a ERRORS+=1) & (echo %%I) 
2
Ist PowersShell eine Option? Wenn dies der Fall ist, könnten Sie [Get-FileHash] (https://msdn.microsoft.com/de-de/powershell/reference/5.1/microsoft.powershell.utility/get-filehash) für nützlich halten. Ich habe einmal ein Skript geschrieben, das die doppelten Dateien aus dem zweiten Pfad entfernt. Dies kann jedoch leicht durch einen anderen Befehl ersetzt werden: https://superuser.com/questions/1219008/find-and-delete-duplicated-files-in-different-disks-und-directories/1219012#1219012 flolilolilo vor 6 Jahren 1
@flolilolilo - Nein, der Rest des Skripts befindet sich bereits in der Skriptsprache der Windows NT-Shell. Gibt es eine triviale Möglichkeit, ein PowerShell-Skript so einzubinden, dass es von einem Windows NT-Shell-Skript aufgerufen wird? Jasper vor 6 Jahren 0
Was passiert, wenn Sie die Zeile von Herrn Hill nehmen und "% D1% \ *. *" Und "% D2% \ *. *" Durch einzelne Dateinamen oder Variablen ersetzen, die einzelne Dateinamen darstellen? Jeff Zeitlin vor 6 Jahren 0
@JeffZeitlin - Ausführen von `fc / b a.txt b.txt | find / v "Vergleichen" | find / v "FC: no *" `von der Befehlszeile liefert keine einfache Ja / Nein-Antwort, verschmutzt jedoch stdout. Jasper vor 6 Jahren 0

1 Antwort auf die Frage

7
rahulatschool

Sie können diesen Code verwenden:

fc /b file1 file2 > nul if errorlevel 1 goto files_differ [files are the same, do something here]  :files_differ [files are not the same, do something here] 

Ein errorlevelof 1wird zurückgegeben, wenn die Dateien NICHT identisch sind.

Ein errorlevelof 2bedeutet, dass eine der Dateien fehlt.

> nul dient zum Ausblenden der Ausgabe des Befehls

Alternativ können Sie Busybox für Windows verwenden und prüfen, ob die Dateihashes gleich sind.

`> nul` isst nur stdout; es verschmutzt immer noch stderr, wenn eine datei fehlt. `1> nul 2> nul` frisst sowohl stdout als auch stderr. Jasper vor 6 Jahren 0
@ Jasper in der Tat! rahulatschool vor 6 Jahren 0
# @ Jasper Oder `> nul 2> & 1` :) DavidPostill vor 6 Jahren 0