Boules Boucles en Batch

Résolu/Fermé
alexpc1 Messages postés 150 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 26 décembre 2009 - 2 janv. 2009 à 11:59
alexpc1 Messages postés 150 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 26 décembre 2009 - 21 janv. 2009 à 00:16
Bonjour, je préviens pour commencer tout lecteur que de BONNES CONNAISSANCES en batch sont requises pour comprendre mon programme.

Celui-çi permet pour tout dossier et sous-dossiers d'effectuer pour chaque fichiers un calcul de CRC-32 et recherche ce crc-32 dans le nom du fichier. (infos sur le crc : https://www.commentcamarche.net/contents/97-controle-d-erreur-crc)
pour deux fichiers identiques il affiche :
    OK   - fichier avec le crc 5AC8BC99.ext
5AC8BC99 - fichier sans le crc dans le nom.ext


mon programme est le suivant:
@echo off
::test d'existence de sous-répertoires
set vide=1
for /f "usebackq delims=" %%b in (`"dir /ad/b"`) do if exist %%b set vide=0
::si il y a existence de sous-répertoires
if %vide%==0 ( 
for /f "usebackq delims=" %%c in (`"dir /ad/b/s | sort /r"`) do (
cd /d %%c
for /f "usebackq delims=" %%d in (`"dir /a-d/b/l"`) do (
for /f "skip=4 tokens=1 delims= " %%e in ('fsum -crc32 "%%d"') do (
echo     OK   - %%d | find /I "%%e" 
if errorlevel 1 echo %%e - %%d
) )
cd .. )
::finalement le dossier en cours
for /f "usebackq delims=" %%d in (`"dir /a-d/b"`) do (
for /f "skip=4 tokens=1 delims= " %%e in ('fsum -crc32 "%%d"') do (
echo     OK   - %%d | find /I "%%e" 
if errorlevel 1 echo %%e - %%d
) )
pause

problème :
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
dans le programme fsum, celui-çi insère 3 lignes qui
empèchent un affichage court des résultats,
je compte donc rajouter une boucle pour
séléctionner seulement le résultat
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

nouveau programme :
@echo off
::test d'existence de sous-répertoires
set vide=1
for /f "usebackq delims=" %%b in (`"dir /ad/b"`) do if exist %%b set vide=0
::si il y a existence de sous-répertoires
if %vide%==0 (
for /f "usebackq delims=" %%c in (`"dir /ad/b/s | sort /r"`) do (
cd /d %%c
for /f "usebackq delims=" %%d in (`"dir /a-d/b/l"`) do (
for /f "skip=4 tokens=1 delims= " %%f in (
for /f "skip=4 tokens=1 delims= " %%e in ('fsum -crc32 "%%d"') do echo %%d) do (
echo     OK   - %%d | find /I "%%f"
if errorlevel 1 echo %%f - %%d)
) ) )
cd .. )
::finalement le dossier en cours
for /f "usebackq delims=" %%d in (`"dir /a-d/b/l"`) do (
for /f "skip=4 tokens=1 delims= " %%f in (
for /f "skip=4 tokens=1 delims= " %%e in ('fsum -crc32 "%%d"') do echo %%d) do (
echo     OK   - %%d | find /I "%%f"
if errorlevel 1 echo %%f - %%d)
) )
pause


Problème :
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Alors que le début du fichier est IDENTIQUE, la console
me renvoie, pour LA PREMIERE BOUCLE un "do était
inattendu" dans le cas où il n'y a pas de sous-dossiers
alors que le premier marche sans problèmes.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Est-ce que quelq'un est capable de comprendre POURQUOI?
P.S.: fsum est gratuit et peut être aussi téléchargé directement sur
http://camusensei.free.fr/fsum.exe
le problème venant de fsum, si vous avec un programme qui est capable de faire
un crc-32 en batch, je suis également preneur...

7 réponses

SAW5 Messages postés 111 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 6 janvier 2010 7
3 janv. 2009 à 11:12
salut,

Alors tu veux selectionner le crc de tous les fichiers d'un dossier (sous-dossiers) et afficher le numero (5AC8BC99) uniquement...c'est ça ce que vous chercher ..?

Exemple :
---------
la sortie de la commande fsum -crc32 flename (pour un errorlevel 0) est

f9cb082f ?CRC32*file.ext

alors vous voulez coder le resultat pour qu'il devienne :

OK - fichier avec le crc f9cb082f.ext


0
alexpc1 Messages postés 150 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 26 décembre 2009 6
3 janv. 2009 à 12:43
Bonjour et merçi !!

Alors je réponds oui et non...

La sortie de fsum est :
SlavaSoft Optimizing Checksum Utility - fsum 2.52.00337
Implemented using SlavaSoft QuickHash Library <www.slavasoft.com>
Copyright (C) SlavaSoft Inc. 1999-2007. All rights reserved.

; SlavaSoft Optimizing Checksum Utility - fsum 2.52.00337 <www.slavasoft.com>
;
; Generated on 01/03/09 at 12:43:25
;
23e3f5a1 ?CRC32*acc.exe
Et je souhaite coder le resultat pour qu'il devienne :
23e3f5a1
je pourrais ensuite me débrouiller pour la mise en forme
pour tout dire mon programme fait ceçi :
si (la chaîne "23e3f5a1" existe dans "acc.exe") alors afficher
    OK   - acc.exe
sinon afficher
23e3f5a1 - acc.exe


Cependant, mon programme marcherait si je n'avais pas le "do inattendu" pour le test du dossier vide de sous-dossiers... mon problème porte plutôt sur çeci.
Sinon, je ne dis pas non si vous arriver a trouver n'importequel programme qui peut me faire un crc32 ...
Merci encore
0
SAW5 Messages postés 111 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 6 janvier 2010 7
3 janv. 2009 à 13:58
à vrai dire j'ai pas eu le temps (et le courage) de déboguer votre code,
il y a tellement de boucle qu'il est facile de se perdre..voici une autre
solution, qui pourra être avec quelques "corrections" une solution..

@Echo off & Setlocal enableextensions enabledelayedexpansion


For /f "Tokens=*" %%a In ('dir /a-d /b /s "*.*"') Do call :nxt "%%a"
Endlocal & pause & Exit

:nxt
For /f "Tokens=1-3 delims=*? "   %%a In ('fsum -crc32 "%~1" ^|Find "?"')   Do (
     Echo Ok - %%a - %%c     >>Ok.txt)

For /f "Tokens=1-5 delims=. "    %%A In ('fsum -crc32 "%~1" ^|Find /v "?"') Do (
     Echo.%%A - %%A.%%B      >>No.txt)






0
alexpc1 Messages postés 150 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 26 décembre 2009 6
3 janv. 2009 à 17:58
Rebonjour.

Merci pour votre solution, cependant il y a là le même problème que moi :
Tout ce que le programme affiche c'est, pour chacun des fichiers :
SlavaSoft Optimizing Checksum Utility - fsum 2.52.00337
Implemented using SlavaSoft QuickHash Library <www.slavasoft.com>
Copyright (C) SlavaSoft Inc. 1999-2007. All rights reserved.

Même si il y a des erreurs dans le code, le programme affiche, peu importe dans quoi il est, ces trois lignes. ce qui empêche toute mise en forme de son résultat.
Vous pouvez essayer chez vous, il se passera la même chose, et je n'arrive pas a trouver un autre programme.

merci encore

<edit>je précise que je veux que l'invité de commande affiche les résultats et non pas les fichiers textes...</edit>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAW5 Messages postés 111 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 6 janvier 2010 7
4 janv. 2009 à 17:28
Salut,

j'ai pas eu le temps de me pencher sur votre problème, sinon voici une solution...

@ECHO OFF

For /f "Tokens=*" %%a In ('dir /a-d /b /s "*.*"') Do call :nxt "%%a"

Endlocal & pause & Exit

:nxt
For /f "Tokens=1-3 delims=*? "   %%a In ('fsum -crc32 "%~1" 2^>NUL') Do (
      Echo.%%a%%b%%c |Find "CRC32" >NUL
      IF not ErrorLevel 1 (Echo Ok - %%c)
 )
0
alexpc1 Messages postés 150 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 26 décembre 2009 6
13 janv. 2009 à 21:51
Bonsoir

Tout d'abord merci beaucoup!!!! Votre programme est très concis et efficace!
J'ai mis pas mal de temps a analyser et essayer le programme, mais j'ai finalement compris pratiquement tout, si vous avez le temps pouvez vous svp m'expliquer le 'tokens=*', le 'tokens=1-3' et pourquoi il y a un espace après le '*?'.
Merci d'avance.

Ensuite, j'ai intégré le programme dans un autre à moi, vu que ne ne souhaite voir apparaître que les noms de fichiers et non les chemins.

le problème que j'ai est le suivant
j'apelle :check
qui effectue sa tâche en se servant de :nxt
quand il a fini, au lieu de retourner là où je l'ai apellé, :nxt se lance.
en clair le problème simplifié ressemble à ça:
echo 1
call :check
echo 1.5
pause & exit
:check
echo 2
call :nxt
echo 2.5
:nxt
echo 3
donne
1
2
3
2.5
3
1.5
au lieu de ce que je souhaiterais :
1
2
3
2.5
1.5
comment puis-je modifier mon programme pour que :nxt ne se lance pas tout seul lorsque :check a fini ?
je ne peux pas faire un retour de type goto parce que j'apelle :check deux fois dans le programme...
merci encore !!!!!!!!!!!!

P.S.: je vous met le programme seulement si vous n'arrivez pas a comprendre ce que je voulais dire. Inutile de chercher a le comprendre.
@echo off
::test d'existence de sous-répertoires
set vide=1
for /f "usebackq delims=" %%b in (`"dir /ad/b"`) do ( if exist %%b set vide=0 )

::si il y a existence de sous-répertoires
if %vide%==0 (
for /f "usebackq delims=" %%c in (`"dir /ad/b | sort /r"`) do (
cd /d %%c
call :check )
cd .. )

::finalement le dossier en cours
call :check  
pause
exit


:check
For /f "Tokens=*" %%a In ('dir /a-d /b "*.*"') Do call :nxt "%%a"

:nxt
set var=%~1
For /f "Tokens=1-3 delims=*? "   %%a In ('fsum -crc32 "%var%" 2^>NUL') Do (
      Echo    OK    - %var% | Find /I "%%a"
      IF ErrorLevel 1 ( echo %%a - %var% )
 )
merci !!

ah oui!!! pourquoi ce '2^' ? '^' n'aurait pas suffi?
0
alexpc1 Messages postés 150 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 26 décembre 2009 6
21 janv. 2009 à 00:16
pour clore le therad, voici le programme final :
@echo off
::test d'existence de sous-répertoires
set vide=1
for /f "usebackq delims=" %%b in (`"dir /ad/b"`) do if exist %%b set vide=0
::si il y a existence de sous-répertoires
if %vide%==0 (
for /f "usebackq delims=" %%c in (`"dir /ad/b | sort /r"`) do (
cd /d %%c
call :check )
cd .. )
::finalement le dossier en cours
call :check  
pause
exit


:check
For /f "Tokens=*" %%d In ('dir /a-d /b "*.*"') Do (
For /f "Tokens=1 delims=*? "   %%a In ('fsum -crc32 "%%d" 2^>NUL') Do (
	Echo    OK    - %%d | Find /I "%%a">>txt.txt
	Echo    OK    - %%d | Find /I "%%a"
IF ErrorLevel 1 ( echo %%a - %%d>>txt.txt
	         echo %%a - %%d ) ) )


il affiche les résultats à l'écran et les enregistre dans txt.txt.
possibilité de fair un fichier texte pour les échecs et un pour les succès.

puisse-cela aider une quelconque personne, pour moi c'est assez !
0