Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

batch windows+comparer deux repertoires+lister fichiers differents

8 réponses
Avatar
TOF
Bonjour

Je cherche à comparer les fichiers de 2 repertoires (avec toute
l'arborescense) et de récuperer une liste de fichiers nouveaux ou modifiés
(conserver les +recents) avec leur chemin respectif dans un fichier txt.

J'ai essayé de m'inspirer d'un batch ou l'utilisateur compare 2 repertoires
mais dans c:\windows\system32.

Je n'arrive pas à interpoler cette recherche à 2 emplacements persos (par
exemple c:\monrep\)

De + A la difference du script ci dessous où un fichier A_Comparer.txt donne
la liste des fichiers à comparer, moi je veux le faire pour tous les
fichiers contenus dans mes 2 dossiers

Merci d'avance

Code :

cd C:\
if exist Differences.txt del Differences.txt
set bckfolder=C:\A_Comparer
for /f "delims=" %%a in (A_Comparer.txt) do call :cmd "%%a"
echo Les fichiers differents sont affiches dans C:\Differences.txt
pause
exit

:cmd
set fullfile=%~1
set file=%~nx1
echo N | comp "%bckfolder%\%file%" "%fullfile%" > NUL 2> NUL
if errorlevel 1 echo %fullfile% >> Differences.txt
goto :eof



tof

8 réponses

Avatar
dominique
TOF wrote:
Bonjour

Je cherche à comparer les fichiers de 2 repertoires (avec toute
l'arborescense) et de récuperer une liste de fichiers nouveaux ou modifiés
(conserver les +recents) avec leur chemin respectif dans un fichier txt.

J'ai essayé de m'inspirer d'un batch ou l'utilisateur compare 2 repertoires
mais dans c:windowssystem32.

Je n'arrive pas à interpoler cette recherche à 2 emplacements persos (par
exemple c:monrep)




un vieux truc archivé qui fait à peu près ça :

@echo off
setlocal

if exist compare.log del compare.log

set dirA=C:dir1
set dirB=C:dir2

for /R "%dirA%" %%I in (*.*) do call :_process "%%I"
for /R "%dirB%" %%I in (*.*) do call :_process "%%I"
goto :eof

:_process
set relpath=%~1
echo 1%relpath%
call set relpath=%%relpath:%dirA%=%%
echo 2%relpath%
if exist "%dirB%%relpath%" (
fc /A /W /L /N "%dirA%%relpath%" "%dirB%%relpath%" >> compare.log
) else (
echo %~n1%~x1 exists only in %~d1%~p1 >> compare.log
)

goto :eof
pause
Avatar
TOF
Salut

merci pour ce code mais j'ai 2 remarques:
- pourquoi il re liste l'intégralité des fichiers du dir2 en disant qu'ils
ne sont que dans dir2 à la fin dans le compare.log?
- n'est il pas possible de n'avoir que le chemin des fichiers qui sont
différents dans le compare.log?

merci par avance

tof

"dominique" a écrit dans le message de groupe de
discussion : g9hfrq$krv$
TOF wrote:
Bonjour

Je cherche à comparer les fichiers de 2 repertoires (avec toute
l'arborescense) et de récuperer une liste de fichiers nouveaux ou
modifiés
(conserver les +recents) avec leur chemin respectif dans un fichier txt.

J'ai essayé de m'inspirer d'un batch ou l'utilisateur compare 2
repertoires
mais dans c:windowssystem32.

Je n'arrive pas à interpoler cette recherche à 2 emplacements persos (par
exemple c:monrep)




un vieux truc archivé qui fait à peu près ça :

@echo off
setlocal

if exist compare.log del compare.log

set dirA=C:dir1
set dirB=C:dir2

for /R "%dirA%" %%I in (*.*) do call :_process "%%I"
for /R "%dirB%" %%I in (*.*) do call :_process "%%I"
goto :eof

:_process
set relpath=%~1
echo 1%relpath%
call set relpath=%%relpath:%dirA%=%%
echo 2%relpath%
if exist "%dirB%%relpath%" (
fc /A /W /L /N "%dirA%%relpath%" "%dirB%%relpath%" >> compare.log
) else (
echo %~n1%~x1 exists only in %~d1%~p1 >> compare.log
)

goto :eof
pause


Avatar
dominique
TOF wrote:
Salut

merci pour ce code mais j'ai 2 remarques:
- pourquoi il re liste l'intégralité des fichiers du dir2 en disant
qu'ils ne sont que dans dir2 à la fin dans le compare.log?
- n'est il pas possible de n'avoir que le chemin des fichiers qui sont
différents dans le compare.log?

merci par avance



Ca buggait un peu..
Ca doit être mieux.
Pour le compare.log, c'est à toi de gérer la sortie de la commande fc
comme dans ton exemple avec errorlevel...


@echo off
setlocal

if exist compare.log del compare.log

set dirA=D:dir1
set dirB=D:dir2

for /R "%dirA%" %%I in (*.*) do call :_process "%%I" 1
for /R "%dirB%" %%I in (*.*) do call :_process "%%I" 2
goto :eof

:_process
if %~2==1 (
set dir1=%dirA%
set dir2=%dirB%
) else (
set dir1=%dirB%
set dir2=%dirA%
)
set relpath=%~1
call set relpath=%%relpath:%dir1%=%%
if exist "%dir2%%relpath%" (
if %~2==1 (
fc /A /W /L /N "%dir1%%relpath%" "%dir2%%relpath%" >> compare.log
) ) else (
echo %~n1%~x1 exists only in %~d1%~p1 >> compare.log
)
Avatar
TOF
Salut

un grand merci à toi dominique. cela fait exactement ce que je veux....

c'etait trop dur pour un newbie comme moi

voici le code final tel que je le voulais:

@echo OFF
setlocal

if exist compare.log del compare.log
if exist effacer.log del effacer.log

set dirA=c:dir1
set dirB=c:dir2

for /R "%dirA%" %%I in (*.*) do call :_process "%%I" 1
for /R "%dirB%" %%I in (*.*) do call :_process "%%I" 2
goto :eof

:_process
if %~2==1 (
set dir1=%dirA%
set dir2=%dirB%
) else (
set dir1=%dirB%
set dir2=%dirA%
)
set relpath=%~1
call set relpath=%%relpath:%dir1%=%%
if exist "%dir2%%relpath%" (
if %~2==1 (
echo N | fc /A /W /L /N "%dir1%%relpath%" "%dir2%%relpath%" > NUL 2> NUL
if errorlevel 1 echo FICHIERS DIFFERENTS %dir1%%relpath% >> compare.log
) ) else (
echo %~d1%~p1%~n1%~x1 >> effacer.log
)



"dominique" a écrit dans le message de groupe de
discussion : g9k6q3$oi6$
TOF wrote:
Salut

merci pour ce code mais j'ai 2 remarques:
- pourquoi il re liste l'intégralité des fichiers du dir2 en disant
qu'ils ne sont que dans dir2 à la fin dans le compare.log?
- n'est il pas possible de n'avoir que le chemin des fichiers qui sont
différents dans le compare.log?

merci par avance



Ca buggait un peu..
Ca doit être mieux.
Pour le compare.log, c'est à toi de gérer la sortie de la commande fc
comme dans ton exemple avec errorlevel...


@echo off
setlocal

if exist compare.log del compare.log

set dirA=D:dir1
set dirB=D:dir2

for /R "%dirA%" %%I in (*.*) do call :_process "%%I" 1
for /R "%dirB%" %%I in (*.*) do call :_process "%%I" 2
goto :eof

:_process
if %~2==1 (
set dir1=%dirA%
set dir2=%dirB%
) else (
set dir1=%dirB%
set dir2=%dirA%
)
set relpath=%~1
call set relpath=%%relpath:%dir1%=%%
if exist "%dir2%%relpath%" (
if %~2==1 (
fc /A /W /L /N "%dir1%%relpath%" "%dir2%%relpath%" >> compare.log
) ) else (
echo %~n1%~x1 exists only in %~d1%~p1 >> compare.log
)


Avatar
TOF
J'ai tout de même l'impression qu'il ne parcours pas l'arborescence
complète..

Ou bien qu'il ne comprends pas certains noms de fichiers style DW-1533E LOT
2_Compo_tour_tech_niv_+0.30_à_14.50.dwg

merci


"dominique" a écrit dans le message de groupe de
discussion : g9k6q3$oi6$
TOF wrote:
Salut

merci pour ce code mais j'ai 2 remarques:
- pourquoi il re liste l'intégralité des fichiers du dir2 en disant
qu'ils ne sont que dans dir2 à la fin dans le compare.log?
- n'est il pas possible de n'avoir que le chemin des fichiers qui sont
différents dans le compare.log?

merci par avance



Ca buggait un peu..
Ca doit être mieux.
Pour le compare.log, c'est à toi de gérer la sortie de la commande fc
comme dans ton exemple avec errorlevel...


@echo off
setlocal

if exist compare.log del compare.log

set dirA=D:dir1
set dirB=D:dir2

for /R "%dirA%" %%I in (*.*) do call :_process "%%I" 1
for /R "%dirB%" %%I in (*.*) do call :_process "%%I" 2
goto :eof

:_process
if %~2==1 (
set dir1=%dirA%
set dir2=%dirB%
) else (
set dir1=%dirB%
set dir2=%dirA%
)
set relpath=%~1
call set relpath=%%relpath:%dir1%=%%
if exist "%dir2%%relpath%" (
if %~2==1 (
fc /A /W /L /N "%dir1%%relpath%" "%dir2%%relpath%" >> compare.log
) ) else (
echo %~n1%~x1 exists only in %~d1%~p1 >> compare.log
)


Avatar
dominique
TOF wrote:
J'ai tout de même l'impression qu'il ne parcours pas l'arborescence
complète..



Il manque encore des ""

echo %~n1%~x1 exists only in %~d1%~p1
=>
echo "%~n1%~x1" exists only in "%~d1%~p1"
Avatar
TOF
Marche toujours pas avec les ""

J'ai une autre idée pour mon batch

est il possible de faire une comparaison de nom de dossier entre deux
chemins?

Comme ca c'est plus simple. je supprime les dossiers en trop et basta...

merci d'avance



"dominique" a écrit dans le message de groupe de
discussion : g9mr7l$noi$
TOF wrote:
J'ai tout de même l'impression qu'il ne parcours pas l'arborescence
complète..



Il manque encore des ""

echo %~n1%~x1 exists only in %~d1%~p1
=>
echo "%~n1%~x1" exists only in "%~d1%~p1"


Avatar
Christian ASTOR
On 1 sep, 11:18, "TOF" wrote:

Je cherche à comparer les fichiers de 2 repertoires (avec toute
l'arborescense) et de récuperer une liste de fichiers nouveaux ou modif iés
(conserver les +recents) avec leur chemin respectif dans un fichier txt.



Il ya divers exemples en C ou C++ sur le Web.
Par ex, en C++ : http://www.personalmicrocosms.com/Pages/dircmp.aspx
Il suffit de modifier le source pour changer éventuellement le log...