Questão Como verificar se dois arquivos são idênticos, dentro de um script de shell do Windows?


Eu estou escrevendo um script de shell usando a linguagem de script de shell do Windows NT (ish). (Meu computador tem o Windows 10.) Eu quero verificar se dois arquivos de texto são idênticos. Se os arquivos forem idênticos, quero que meu script faça uma coisa. Se os arquivos não forem idênticos, quero que meu script faça outra coisa. O script não deve pausar para solicitar a inserção manual de mais dados.

A lista "Perguntas similares" tem perguntas sobre scripts de shell do Macintosh e do bash. Ele também tem uma resposta sobre a execução fc ou comp da linha de comando, que fornecem uma saída detalhada. Infelizmente, fc não retorna um resultado para %errorlevel%e  comp pede entrada de dados manual em vez de simplesmente sair.

Eu tenho uma cópia do livro de Tim Hill no shell script do Windows NT. Página 216 tem a seguinte linha de código, onde %D1% e %D2% são diretórios, mas eu não sei como modificá-lo para trabalhar em apenas um único par de arquivos:

for /f "tokens=*" %%I in ('fc /b %D1%\*.* %D2%\*.* ^| find /v "Comparing" ^| find /v "FC: no*"') do (set /a ERRORS+=1) & (echo %%I)

2


origem


O PowersShell é uma opção? Porque se for, você pode encontrar Get-FileHash útil. Certa vez, escrevi um script que remove os arquivos duplicados do segundo caminho; no entanto, pode-se facilmente substituir isso por outro comando: superuser.com/questions/1219008/… - flolilolilo
@flolilolilo - Não, o resto do script já está na linguagem de script de shell do Windows NT. Existe uma maneira trivial de envolver um script do PowerShell para ser chamado por um script de shell do Windows NT? - Jasper
O que acontece se você pegar a linha do Sr. Hill e substituir %D1%\*.* e %D2%\*.* com nomes de arquivos únicos ou variáveis ​​que representam nomes de arquivos únicos? - Jeff Zeitlin
@JeffZeitlin - em execução fc /b a.txt b.txt | find /v "Comparing" | find /v "FC: no*" a partir da linha de comando não produz uma simples resposta sim / não, mas polui stdout. - Jasper


Respostas:


Você pode usar este código:

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]

A errorlevel do 1 é retornado se os arquivos NÃO forem idênticos.

A errorlevel do 2 significa que um dos arquivos está faltando.

> nul é usado para ocultar a saída do comando

Alternativamente, você pode usar Busybox para o Windows e verifique se os hashes do arquivo são os mesmos.


6



> nul só come stdout; ainda polui stderr quando um arquivo está faltando. 1> nul 2> nul come stdout e stderr. - Jasper
@Jasper De fato! - rahulatschool
# @ Jasper Or >nul 2>&1 :) - DavidPostill♦