IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Problème lors de l'entrée dans une boucle FOR [Batch]


Sujet :

Scripts/Batch

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Problème lors de l'entrée dans une boucle FOR
    Bonjour,

    Je vous contacte car je débute dans l'écriture de script Batch et que je suis confronté à un problème.

    Pour le contexte, je suis en train de créer un Intranet et ce batch va me servir à notifier les utilisateurs si un fichier a été ajouté ou modifié sur l'Intranet le jour précédant (exécution du batch chaque matin).

    En utilisant la méthode echo/pause, j'ai pu déterminer qu'il y avait une erreur lors de l'entrée dans la boucle FOR. Mon echo test1 passe bien et est visible en console mais pas mon echo test2. C'est possible que l'erreur soit idiote mais je m'arrache les cheveux dessus
    De plus, je ne sais pas si la suite fonctionne vu que le script plante et comme je débute, il y a surement des améliorations possibles.

    Voilà mon code, j'espère que l'un de vous va pouvoir m'aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    title ScriptNotifMailIntranet
    cd desktop
    
    :: On récupère la date du système
    set tmps=%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%
    :: On la stocke dans la variable datesys pour tester 
    :: la valeur du jour précédant
    set datesys = %tmps% - 1
    
    :: On initialise une variable j utilisé pour la création du mail
    :: Si j = 0 On créera le fichier mail.txt
    :: Sinon on ajoutera uniquement le nom du fichier à la suite du fichier
    set j = 0
    
    :: On crée un fichier liste.txt qui va récuperer la liste des fichiers découlant du
    :: répertoire source ainsi que les chemins associé
    dir /b /s /a-d >> liste.txt
    
    echo test1
    pause
    
    :: Début de la boucle For
    for /f %%i in (C:\Users\Bakkun\desktop\liste.txt) do (
    	
            echo  test2
            pause
    
    	:: On récupère la date du fichier en cours
    	dir /tw %%i >> datefichier.txt
    	set /p tmpf = < datefichier.txt
    	set datefichier=%tmpf:~-4%%tmpf:~-7,2%%tmpf:~-10,2%
    	
    	:: On compare les deux dates si elles sont égales on rentre dans le if
    	if %datefichier% == %datesys% (
    		
    		:: On récupère le nom du fichier
    		dir /b %%i >> nomfichier.txt
    		set /p nomfichier = < nomfichier.txt
    
    		:: j=0, on crée le début du mail
    		if %j% == 0(
    			echo Les fichiers suivants ont ete ajoutes ou modifies dernierement : >> mail.txt
    			:: On met j à 1 pour éviter de réécrire le début du mail
    			set j = 1
    		)
    		
    		:: On ajoute maintenant le nom du fichier dans le corps du mail
    		echo nomfichier >> mail.txt
    	)
    	
    	:: Pour éviter les conflits dans les prochaines itérations de la boucle
    	:: on supprime les fichiers temporaires de date et de nom du fichier testé
    	del datefichier.txt
    	del nomfichier.txt
    
    )
    
    :: Une fois que la boucle est finie, la liste ne nous ai plus d'aucune utilité
    del liste.txt
    
    :: On teste si le fichier mail.txt existe
    :: Si il existe, cela veut dire qu'un fichier au moins a été positif au test
    :: et necessite une notification par mail
    if exist mail.txt(
    	
    	:: On appelle wmailto pour envoyer le contenu de mail.txt par mail
    	wmailto -t"C:\Users\Bakkun\desktop\mail.txt" -s"Un Fichier a ete ajoute ou mofifie" toto@toto.com
    
    	:: Le mail envoyé, on supprime le fichier mail.txt pour éviter
    	:: les conflits lors des prochains lancements du script
    	del mail.txt
    )
    
    pause

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    La commande forfiles peut t’intéresser ?!

    Sinon je ne voit rien de particulier dans le script après ça peux venir d'un caractère spécial.
    Je te conseil de commenter un maximum ton script et de dé-commenter au fur et a mesure afin de trouver la source du problème.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    La commande forfiles peut t’intéresser ?!

    Sinon je ne voit rien de particulier dans le script après ça peux venir d'un caractère spécial.
    Je te conseil de commenter un maximum ton script et de dé-commenter au fur et a mesure afin de trouver la source du problème.
    Merci pour ta réponse,

    Effectivement cette fonction devrait me simplifier la tâche, je vais essayer ça ce matin et je fermerai la discussion si j'arrive à l'utiliser comme je le souhaite

    Par contre, j'ai toujours mon problème au niveau de ma boucle FOR. En fait, mon batch rentre bien dans la boucle mais j'ai l'impression qu'il n'accepte pas de conditions à l'intérieur de la boucle car il plante au moment de faire un IF.
    J'ai essayé une alternative en sortant les IF et en y accédant avec des GOTO mais ça ne marche pas non plus (il fait bien ma première itération mais plante quand il doit faire les suivantes).

    Et par curiosité, les variables créées ont-elles une durée de vie ? J'ai remarqué que la variable j que j'initialise au début, n'est plus trouvée par la script par la suite et quand j'essaye de l'afficher, j'ai le droit à un magnifique Commande Echo activée.

    Je suis désolé de poser autant de questions qui sont pas "passionantes" pour les gens qui s'y connaissent mais ce sont mes débuts dans ce "langage" et je le trouve très intéressant

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Encore merci ericlm128, la commande forfiles m'a permis de faire ce que je voulais.

    Petite pensée à ceux qui un jour chercheront à faire un script similaire au mien. Voici la solution à mon problème dûment commentée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    @echo off
    title ScriptNotifMailIntranet
    cd desktop
    
    :: On récupère la date du système
    set tmps=%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%
    
    :: Decrémente la variable pour tester 
    :: la valeur du jour précédent
    set /a tmps= %tmps% - 1
    
    :: On remet en forme la date sous le format JJ/MM/AAAA nécessaire
    :: pour la commande forfiles
    set datetestee=%tmps:~6,2%/%tmps:~4,2%/%tmps:~0,4%
    
    :: On parcourt le répertoire des fichiers ainsi que les sous-répertoires
    :: et on stocke le nom de tous les fichiers positifs au test de la date
    :: dans le fichier liste.txt
    
    :: Un fichier est positif au test de la date si il a été créé le jour précédent ou le jour même 
    
    :: /s permet de parcourir le répertoire et les sous-répertoires
    :: /m sélectionne les documents avec une extension, on exclue les répertoires
    :: /c exécute la commande entre "" ATTENTION la commande doit obligatoirement commencée par :  cmd /c
    :: /d +date exclue les fichiers ayant une date de création/modification plus vieux que la date testée
    forfiles /s /m *.* /c "cmd /c echo @file >> C:\Users\Bakkun\desktop\liste.txt" /d +%datetestee%
    
    :: Si la commande précédente n'a pas trouvé de fichiers récents, le fichier liste.txt n'aura pas été créé
    if exist liste.txt (
    			:: On commence le corps du mail
    			echo Bonjour, >> mail.txt
    			echo Les fichiers suivants ont ete ajoutes ou modifies dernierement sur l'Intranet : >> mail.txt
    			
    			:: On copie les lignes de liste.txt à la suite du corps du mail
    			for /f "tokens=1,* delims=:" %%i in ('findstr /n /r . liste.txt') do if %%i geq 1 echo %%j >> mail.txt
    
    			:: On appelle wmailto pour envoyer le contenu de mail.txt par mail
    			wMailTo -t"C:\Users\Bakkun\desktop\mail.txt" -s"Un Fichier a ete ajoute ou mofifie" toto@toto.com
    ) else (
    	exit
    )
    ::On supprime les fichiers temporaires créés
    del liste.txt
    del mail.txt
    pause
    Ce script permet donc de récupérer dans un fichier texte, le nom de tous les fichiers ayant 1 jour d'ancienneté ou moins (sélection des fichiers créés les jours J et J-1). Puis d'envoyer via wmailto, le fichier texte à(aux) adresse(s) choisie(s).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Modification des paramètres d'entrée dans une boucle FOR
    Par reppier dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 15/06/2009, 15h23
  2. [Embedded Function] Problème dans une boucle FOR-END
    Par roilait dans le forum Simulink
    Réponses: 6
    Dernier message: 19/04/2008, 14h55
  3. Problème d'indexage dans une boucle FOR-END
    Par RAMZOON dans le forum MATLAB
    Réponses: 3
    Dernier message: 19/10/2007, 00h59
  4. Problème avec une DLL dans une boucle For
    Par BraDim dans le forum Langage
    Réponses: 5
    Dernier message: 20/09/2005, 12h22
  5. Réponses: 3
    Dernier message: 06/07/2004, 10h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo