[BATCH] Blocage du batch sans erreur

Résolu/Fermé
JEC_noob Messages postés 9 Date d'inscription mercredi 10 octobre 2012 Statut Membre Dernière intervention 11 octobre 2012 - 10 oct. 2012 à 19:19
Nyctaclope Messages postés 5315 Date d'inscription dimanche 6 avril 2008 Statut Membre Dernière intervention 11 décembre 2022 - 11 oct. 2012 à 14:33
Bonjour,

Je travail sur un batch qui est composé de plusieurs petits codes testés sur ma machine.
Lorsque je met le tout bout à bout pour enfin bénéficier du fruit de mon dur labeur:
-ça plante...
-Mais bizarrement!
-Sans même un message d'erreur...
-La fenêtre de commande reste juste immobile...
-Et je ne lui demande d'exécuter aucun programme ou rien qui pourrait prendre du temps...

Je suis désolé mais étant donné que c'est pour le boulot et que tout les petits bouts de codes fonctionnent... J'imagine que je me suis planter sur l'assemblage et je voudrais savoir ce qui peut générer ce genre de symptômes...

Je vous remercie, et désolé de pas pouvoir montrer le code...


3 réponses

Nyctaclope Messages postés 5315 Date d'inscription dimanche 6 avril 2008 Statut Membre Dernière intervention 11 décembre 2022 1 250
10 oct. 2012 à 19:37
Bonsoir

Il est probable que l'un(e) des programmes/commandes lancé(e)s ne se termine pas , ou attend une donnée ?..

Pour tester, mets des "REM" devant chaque ligne du batch pour la neutraliser, et teste en enlevant après chaque essai le REM de la ligne suivante . Tu verras où cela coince, ensuite il "restera" à trouver pourquoi ..
Tu peux aussi tester le Errorlevel après chaque ligne , ou faire des "echo" provisoires pour afficher les résultats à mesure ..
Cela dépend bien sûr de la structure et contenu de ton batch ..

Dommage que tu ne puisses fournir ton listing, mais cela serait sans doute difficile de le tester ailleurs que sur ton PC ..

A+
Nyctaclope
0
JEC_noob Messages postés 9 Date d'inscription mercredi 10 octobre 2012 Statut Membre Dernière intervention 11 octobre 2012
10 oct. 2012 à 19:45
Merci, j'ai fait quelque chose dans le genre et j'ai repéré le problème:
Je veux copier un fichier en remplaçant une ligne du fichier

Je m'y prend ainsi:
for /f "tokens=1,* delims=:" %%i in ('findstr /n /r . A.dat') do (
if %%i geq 1 if %%i leq 2 echo %%j >> B.dat
)
echo blabla>> B.dat
for /f "tokens=1,* delims=:" %%i in ('findstr /n /r . A.dat') do (
if %%i geq 4 if %%i leq 5 echo %%j >>B.dat
)


Traduction:
-Je copie les ligne 1 a 2 dans le fichier B
-Puis j'écris une ligne
-Puis les je copie les lignes de 4 à 5.

ça! C'est ce qui marche! Mais en vrai le fichier A fait 300000 ligne! est-ce que ça peut poser un problème?
0
JEC_noob Messages postés 9 Date d'inscription mercredi 10 octobre 2012 Statut Membre Dernière intervention 11 octobre 2012
10 oct. 2012 à 19:50
OU ALORS!!!

ça marche mais ça prend une plombe!!
Je lance le batch et je reviens demain matin!

Mais je reste preneur si quelqu'un a une idée de limite de ligne de la fonction FIND en BATCH!
0
Nyctaclope Messages postés 5315 Date d'inscription dimanche 6 avril 2008 Statut Membre Dernière intervention 11 décembre 2022 1 250
Modifié par Nyctaclope le 10/10/2012 à 22:37
Re

Bon, c'est un peu loin pour moi, mais apparemment tout le fichier est parcouru, donc c'est lourd ..
Je ne sais s'il y a une limite pour Find, mais , uniquement par intuition, j'aurais fait deux étapes :
1// stoker les lignes trouvées par findstr dans un fichier tampon via ">>"
2// ensuite le ratisser par le For
j'ai l'impression que cela gagnerait du temps ? car les tests ne sont faits que sur les lignes intéressantes. Mais c'est à voir selon le contenu de ton fichier A.dat
Mais je n'ai peut être pas tout saisi de ta manip ..
Par ailleurs je n'ai pas compris le sens de la variable "%%j"

Je pense que les résultats intermédiaires sont écrits dans des fichiers temporaires sur disque, et non en RAM ?
As tu envisagé d'utiliser un disque en RAM ??

A+
Nyctaclope
0
JEC_noob Messages postés 9 Date d'inscription mercredi 10 octobre 2012 Statut Membre Dernière intervention 11 octobre 2012
11 oct. 2012 à 09:25
La variable %%J est la ligne que je copie dans le nouveau fichier.
Mais comment cette variable est modifiée... J'en sais rien.
Et pour la RAM... Je ne vois pas comment faire.

Il semble que ça marche si je lui laisse du temps, ce matin la démarche était terminée.
Etant donné que les 200000 premières lignes ne changent pas, je vais seulement rajouter les dernières en préparant les fichiers de départ. ça devrait être plus rapide. mais ça m'oblige à dupliquer les fichiers à la main...
0
JEC_noob Messages postés 9 Date d'inscription mercredi 10 octobre 2012 Statut Membre Dernière intervention 11 octobre 2012
11 oct. 2012 à 09:53
J'ai décomposé A.dat en A_A.dat et A_B.dat.
Je copie les 200000 lignes.
Puis j'écris la ligne à modifier.
Enfin je fais un echo par ligne du A_B.dat... (Pas très joli mais ça marche...)
for %%B in (1) do (
		copy  A_A.dat B.dat
		echo blabla >> B.dat
		echo A_B1 >> B.dat
                ....
                echo A_B20 >> B.dat
		pause
                )


en tout cas, merci Nyctaclope pour tes conseils!
0
Nyctaclope Messages postés 5315 Date d'inscription dimanche 6 avril 2008 Statut Membre Dernière intervention 11 décembre 2022 1 250
11 oct. 2012 à 14:08
Re

Je reviens sur le mode de travail éventuel en RAM ...
Je ne connais pas la mécanique intime des commandes telles que find et for, mais il est possible que les résultats en cours soient écrits sur des fichiers temporaires, donc sur disque dur, plutôt qu'en RAM, et cela peut donc être relativement assez lent ..

Sans doute connais tu :
Autrefois, on pouvait, en appelant un gestionnaire ( ramdisk.sys ) dans le fichier de démarrage config.sys de DOS créer un disque virtuel en mémoire RAM ( disque formatable, "écrivable" et lisible exactement comme un disque normal, mais avec les vitesses importantes permises par la RAM ). Certains gestionnaires permettaient même de retrouver le contenu du disque après le redémarrage ..
L'inconvénient est de prélever pour cela une part de la RAM, mais les avantages sont intéressants pour travailler sur des fichiers demandant beaucoup d'écritures et lectures, comme des tris, ou ton traitement de fichiers ..

Cela n'existe plus, mais je me souviens avoir lu qu'il existait maintenant des utilitaires permettant de gérer un tel disque virtuel sous Windows. Je n'ai pas eu l'occasion d'en essayer ..

Cela pourrait être intéressant pour toi de faire l'essai, par exemple en limitant le prélèvement sur la RAM avec un disque virtuel seulement réservé aux fichiers tampons de travail ( ici A_B.dat et B.dat ? ). Si cela marche, tu pourrais gagner beaucoup de temps sur le traitement.

J'essaye de trouver des pistes sous Google ..

A bientôt
Nyctaclope
0
JEC_noob Messages postés 9 Date d'inscription mercredi 10 octobre 2012 Statut Membre Dernière intervention 11 octobre 2012
11 oct. 2012 à 14:18
Je te remercie mais le moyen que j'ai employé est vraiment rapide car il ne reste que quelques dizaines de lignes à écrire une par une. Le plus gros se fait avec la fonction "copy" qui est instantanée.
La modification du fichier A en entier se fait maintenant quasi instantanément.

Si la modification doit se faire au milieu du fichier alors il faut surement creuser dans ta direction car la mienne sera trop longue. Mais dans ce cas, la solution est satisfaisante.

Merci beaucoup pour l'aide! ;)
0
Nyctaclope Messages postés 5315 Date d'inscription dimanche 6 avril 2008 Statut Membre Dernière intervention 11 décembre 2022 1 250
Modifié par Nyctaclope le 11/10/2012 à 14:44
Re

Eh bien, parfait ..
Et ne me remercie pas, je n'ai pas fait grand chose ..
Bonne suite à toi ..
A+
Nyctaclope

PS : au cas où .. fiche sur le ramdisk sous Windows :
https://www.pcastuces.com/pratique/windows/ramdisk_disque_virtuel/page1.htm

Si tu es en 64bits, il faut faire une petite recherche sous Google ..
0