Boules Boucles en Batch
Résolu
alexpc1
Messages postés
150
Date d'inscription
Statut
Membre
Dernière intervention
-
alexpc1 Messages postés 150 Date d'inscription Statut Membre Dernière intervention -
alexpc1 Messages postés 150 Date d'inscription Statut Membre Dernière intervention -
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 :
mon programme est le suivant:
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 :
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...
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...
A voir également:
- Boules Boucles en Batch
- Fichier batch - Guide
- Jeux de boules gratuits à télécharger - Télécharger - Jeux vidéo
- Batch converter - Télécharger - Photo & Graphisme
- Echo off batch ✓ - Forum Autoit / batch
- Mon pc s'allume et s'éteint en boucle ✓ - Forum Matériel & Système
7 réponses
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
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
Bonjour et merçi !!
Alors je réponds oui et non...
La sortie de fsum est :
pour tout dire mon programme fait ceçi :
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
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.exeEt je souhaite coder le resultat pour qu'il devienne :
23e3f5a1je 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
à 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..
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)
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 :
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>
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>
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
j'ai pas eu le temps de me pencher sur votre problème, sinon voici une solution...
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) )
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:
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.
ah oui!!! pourquoi ce '2^' ? '^' n'aurait pas suffi?
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 3donne
1 2 3 2.5 3 1.5au lieu de ce que je souhaiterais :
1 2 3 2.5 1.5comment 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?
pour clore le therad, voici le programme final :
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 !
@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 !