Как проверить, идентичны ли два файла в сценарии оболочки Windows?

1178
Jasper

Я пишу сценарий оболочки, используя язык сценариев оболочки Windows NT (ish). (У меня на компьютере Windows 10.) Я хочу проверить, идентичны ли два текстовых файла. Если файлы идентичны, я хочу, чтобы мой скрипт делал одно. Если файлы не идентичны, я хочу, чтобы мой скрипт делал что-то еще. Скрипт не должен останавливаться, чтобы запросить ручной ввод дополнительных данных.

В списке «Похожие вопросы» есть вопросы о скриптах для Macintosh и bash. Он также имеет ответ о запуске fcили compиз командной строки, которые предоставляют подробный вывод. К сожалению, fcне возвращает результат %errorlevel%и comp запрашивает ручной ввод данных вместо простого выхода.

У меня есть копия книги Тима Хилла о сценариях оболочки Windows NT. Страница 216 содержит следующую строку кода, где %D1%и %D2%находятся каталоги, но я не знаю, как изменить его так, чтобы он работал только с одной парой файлов:

for /f "tokens=*" %%I in ('fc /b %D1%\*.* %D2%\*.* ^| find /v "Comparing" ^| find /v "FC: no*"') do (set /a ERRORS+=1) & (echo %%I) 
2
Является ли PowersShell вариант? Потому что, если это так, вы можете найти [Get-FileHash] (https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/get-filehash) полезным. Однажды я написал скрипт, который удаляет дубликаты файлов со второго пути; однако это можно легко заменить другой командой: https://superuser.com/questions/1219008/find-and-delete-duplicated-files-in-different-disks-and-directories/1219012#1219012 flolilolilo 6 лет назад 1
@flolilolilo - Нет, остальная часть сценария уже написана на языке сценариев оболочки Windows NT. Есть ли тривиальный способ обернуть сценарий PowerShell для вызова сценарием оболочки Windows NT? Jasper 6 лет назад 0
Что произойдет, если вы возьмете строку господина Хилла и замените `% D1% \ *. *` И `% D2% \ *. *` На отдельные имена файлов или переменные, представляющие отдельные имена файлов? Jeff Zeitlin 6 лет назад 0
@JeffZeitlin - Запуск `fc / b a.txt b.txt | найти / v "Сравнение" | find / v "FC: no *" `из командной строки не дает простого ответа да / нет, но загрязняет стандартный вывод. Jasper 6 лет назад 0

1 ответ на вопрос

7
rahulatschool

Вы можете использовать этот код:

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] 

errorlevelИз 1возвращается, если файлы не являются идентичными.

errorlevelИз 2означает, что один из файлов отсутствует.

> nul используется, чтобы скрыть вывод команды

Кроме того, вы можете использовать Busybox для Windows и проверить, совпадают ли хэши файлов.

`> nul` только ест stdout; это все еще загрязняет stderr, когда файл отсутствует. `1> nul 2> nul` ест как stdout, так и stderr. Jasper 6 лет назад 0
@ Джаспер Действительно! rahulatschool 6 лет назад 0
# @ Jasper Or `> nul 2> & 1` :) DavidPostill 6 лет назад 0