2009-03-22 23 views
15

¿Cómo puedo comparar dos archivos en un archivo por lotes y realizar una acción en función de si coinciden o no? He intentado algo como:¿Cómo puedo comparar dos archivos en un archivo por lotes?

if file1.txt NEQ file2.txt goto label 

pero compara la cadena actual "archivo1.txt" en lugar del archivo. He leído sobre el comando COMP, pero parece que no funciona si lo pongo en una declaración if. ¿Alguien sabe cómo hacer esto? Lo siento, pero rara vez uso archivos por lotes y tengo poca experiencia en ellos.

Gracias de antemano.

Respuesta

27

creo que se puede utilizar el comando "FC" y compruebe el nivel de error. Aquí hay algo de código:

@echo off 
:main 
fc c:\filename r:\filemame > nul 
if errorlevel 1 goto error 

:next 
echo insert next CD 
pause 
goto main 

:error 
echo failed check 

(sacado de http://www.computing.net/answers/dos/batch-file-command/15753.html)

+0

también sugiero verificar errorlevel 2, es señal de que algo salió mal (uno de los archivos no se puede abrir, error de disco, etc.). – LogicDaemon

+0

¿Podría aclarar - does errorlevel 0 significa lo mismo, errorlevel 1 significa diferente? ¿O viceversa? –

+1

@CraigMcQueen Tomado de la [referencia de línea de comando] (http://ss64.com/nt/fc.html): "-1: sintaxis inválida (por ejemplo, solo un archivo pasado); 0: los archivos son idénticos; 1 : Los archivos son diferentes. 2: No se puede encontrar al menos uno de los archivos. " – Linkyu

3

Parece que el programa COMP es bastante fácil de usar. Ver this question en las respuestas de Yahoo.

Tenga en cuenta que ejecutar comp /? imprimirá el texto de ayuda para el programa (como lo hace especificando el argumento /? con cualquier programa de línea de comandos nativo de Windows). Esto produce el mismo texto que ve en la respuesta de la pregunta vinculada anteriormente.

contenido de la respuesta Yahoo:

C:\>comp /? 
Compares the contents of two files or sets of files. 

COMP [data1] [data2] [/D] [/A] [/L] [/N=number] [/C] [/OFF[LINE]] 

data1 Specifies location and name(s) of first file(s) to compare. 
data2 Specifies location and name(s) of second files to compare. 
/D Displays differences in decimal format. 
/A Displays differences in ASCII characters. 
/L Displays line numbers for differences. 
/N=number Compares only the first specified number of lines in each file. 
/C Disregards case of ASCII letters when comparing files. 
/OFF[LINE] Do not skip files with offline attribute set. 

To compare sets of files, use wildcards in data1 and data2 parameters. 
+1

gazers de esa respuesta, tenga en cuenta que 'comp' tiene problema: después de cada comparación, interactivamente le pregunta al usuario si quiere comparar más archivos. Y no hay ningún interruptor para desactivar esa consulta, así que la mejor opción es 'echo N | comp file1 file2'. De lo contrario, la comp es más rápida porque primero compara los tamaños y detiene la comparación después de mostrar 10 diferencias, y puede comparar grupos de archivos con máscaras. Por otro lado, 'FC' compara archivos completos a pesar del tamaño, muestra todas las diferencias e intenta resincronizar para similitudes en diferentes desplazamientos (como unix diff). – LogicDaemon

0

utilizo el ejemplo siguiente para crear informes basados ​​en diferencias de archivo:

set %Batch_Work_Space_Dir%=folder for your batch file and temp resource files 
set file_1=name of file 
set file_2=name of file 

fc %file_1% %file_1%t > %Batch_Work_Space_Dir%\Are_They_Different.txt 

powershell -command "(Get-Content %Batch_Work_Space_Dir%\Are_They_Different.txt) | select -skip 1 | Set-Content %Batch_Work_Space_Dir%\Are_They_Different.txt" 
set /p Diff_Found=<%Batch_Work_Space_Dir%\Are_They_Different.txt 
if %Diff_Found:~0,17%" == "FC: no difference" (
    execute commands 
) 
Cuestiones relacionadas