2009-03-22 11 views
15

Comment puis-je comparer deux fichiers dans un fichier séquentiel et effectuer une action selon qu'ils correspondent ou non? J'ai essayé quelque chose comme:Comment puis-je comparer deux fichiers dans un fichier batch?

if file1.txt NEQ file2.txt goto label 

mais il compare la chaîne réelle "fichier1.txt" plutôt que le fichier. J'ai lu à propos de la commande COMP, mais cela ne semble pas fonctionner si je la mets dans une instruction if. Est-ce que quelqu'un sait comment faire cela? Désolé, mais j'utilise rarement des fichiers batch et j'ai peu d'expérience en la matière.

Merci d'avance.

Répondre

27

Je crois que vous pouvez utiliser la commande "FC", puis vérifiez la errorlevel. Voici un code:

@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 

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

+0

aussi je suggère de vérifier errorlevel 2, c'est signe que quelque chose a mal tourné (un des fichiers ne peut pas être ouvert, erreur de disque, etc.). – LogicDaemon

+0

Pourriez-vous préciser - est-ce que errorlevel 0 signifie la même chose, errorlevel 1 signifie différent? Ou vice versa? –

+1

@CraigMcQueen Extrait de la [Référence de la ligne de commande] (http://ss64.com/nt/fc.html): "-1: syntaxe non valide (par exemple, un seul fichier est passé); 0: les fichiers sont identiques; 1 : Les fichiers sont différents.2: Impossible de trouver au moins un des fichiers. " – Linkyu

3

Il semble que le programme COMP soit relativement facile à utiliser. Voir this question sur les réponses Yahoo.

Notez que l'exécution comp /? affichera le texte d'aide pour le programme (tout comme spécifier l'argument /? avec n'importe quel programme de ligne de commande Windows natif). Cela produit le même texte que vous voyez dans la réponse à la question ci-dessus.

contenu de Yahoo Réponse:

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

contemplateurs de cette réponse, notez que 'comp' a problème: après chaque comparaison, il demande interactivement à l'utilisateur s'il veut comparer plus de fichiers. Et il n'y a pas de commutateur pour désactiver cette requête, donc la meilleure option est de 'echo N | comp file1 file2'. Sinon, comp est plus rapide car il compare d'abord les tailles et arrête la comparaison après l'affichage de 10 différences, et peut comparer des groupes de fichiers à l'aide de masques. D'autre part, 'FC' compare les fichiers entiers malgré la taille, affiche toutes les différences, et essaie de resynchroniser les similarités sur différents décalages (comme diff unix). – LogicDaemon

0

Je donne l'exemple ci-dessous pour créer des rapports en fonction des différences de fichiers:

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 
) 
Questions connexes