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 avec les ARRAY et plusieurs boucles FOR imbriquées + DelayedExpansion [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 21
    Par défaut Problème avec les ARRAY et plusieurs boucles FOR imbriquées + DelayedExpansion
    Bonjour,

    J'ouvre cette discussion afin d'obtenir de vous quelques conseils par rapport à un script batch que j'essaye de faire pour mon école (une sorte de projet de mi-parcours).

    Mais j'ai quelques soucis. j'ai des scripts externes, qui créés à la fin plusieurs fichiers contenant des données. Je dois vérifier qu'un fichier spécifique créé est bien dans le répertoire ARCHIVES, et vérifier par la suite que son poids est différent de 0 octets.
    Si le poids du fichier est de 0, le script doit interroger l'utilisateur afin de savoir s'il termine le programme ou s'il continue (Oui/Non).

    Si OUI : on continue
    Si non : On quitte le programme

    Exemple de nom de fichier à traiter : DFEA_181029_0300.txtNom : 2018-10-29 16_06_45-D__Users_carpentierant_Desktop_test_Integration_fichier.bat - Notepad++.png
Affichages : 343
Taille : 55,3 Ko
    Image : Plan des répertoires

    La seule chose qui différencie ce fichiers des autres est la première partie de son nom ("DFEA") et la date de création ("181029").

    Mon but est de faire une boucle de ces 8 exécutions de script.

    Voici ce que j'ai pu faire actuellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    call %AccDepot%DFEA.bat /w
    set error=0
    for /r "%AccArchive%" %%i in (DFEA_%datej%*.txt) do set taille=%%~zi & set nom=%%~nxi
    echo -- Fichier : %nom% --- Taille : %taille% octets --
    if %taille%==0 echo =================== /!\ WARNING /!\ ====================
    if %taille%==0 set /p error=Le fichier cree "%nom%" est vide (0 octets), voulez-vous continuer? (oui/non) : 
    if %taille%==0 call :iferror
    echo.
    
    :iferror
    if /i not %error%==oui echo.
    if /i not %error%==oui echo -- -- -- & echo Fin de l'integration ! & echo -- -- -- & timeout /t 2 > nul & exit
    (après je change juste DFEA avec le nom des autres scripts)

    Et maintenant la boucle que j'ai essayé de faire (non fonctionnelle, le terminal se ferme instantanément) :

    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
    @echo off
    setlocal enableDelayedExpansion 
    
    :: variable chemin acces
    set AccTmp=D:\test\tmp\
    set AccDepot=D:\test\depot\
    set AccArchive=D:\test\archive\
    set datej=%date:~8,2%%date:~3,2%%date:~0,2%
    
    set id=DFEA DPRG DPZERO DPCONF EPZERO EPCONF1 NFIXOPFI FIXOPFI
    
    
    
    for /r "%AccArchive%" %%i in (%id%_%datej%*.txt) do (
    	echo %%~ni
    	call %AccDepot%%%~ni.bat /w
    	set error=0
    	for /r "%AccArchive%" %%i in (%%~ni_%datej%*.txt) do (
    		set nom=%%~nxi & set taille=%%~zi
    		echo -- Fichier : %%~nxi --- Taille : %%~zi octets --
    		if %taille%==0 echo =================== /!\ WARNING /!\ ====================
    		if %taille%==0 set /p error=Le fichier cree "%nom%" est vide (0 octets), voulez-vous continuer? (oui/non) : 
    	)
    	echo.
    )
    pause
    Merci par avance pour toute l'aide que vous pourrez m'apporter

  2. #2
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    ´

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for /r "%AccArchive%" %%i in (DFEA_%datej%*.txt)


    for /? est ton ami !!!

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 21
    Par défaut
    Merci,
    Je teste ça demain et je vous tiens au courant.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 21
    Par défaut
    Citation Envoyé par sachadee Voir le message
    ´

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for /r "%AccArchive%" %%i in (DFEA_%datej%*.txt)


    for /? est ton ami !!!
    Peut-etre qu'il y a eu incompréhension, mais l'ensemble de commande suivant se répète dans mon code actuel 8 fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for /r "%AccArchive%" %%i in (%id%_%datej%*.txt) do (
    	echo %%~ni
    	call %AccDepot%%%~ni.bat /w
    	set error=0
    	for /r "%AccArchive%" %%i in (%%~ni_%datej%*.txt) do (
    		set nom=%%~nxi & set taille=%%~zi
    		echo -- Fichier : %%~nxi --- Taille : %%~zi octets --
    		if %taille%==0 echo =================== /!\ WARNING /!\ ====================
    		if %taille%==0 set /p error=Le fichier cree "%nom%" est vide (0 octets), voulez-vous continuer? (oui/non) : 
    	)
    	echo.
    )
    Or mon but est de mettre ces 8 lancements de scripts ainsi que les vérifications qui vont avec dans une boucle for.
    J'avais essayé précédemment avec un ARRAY mais le résultat n'était pas satisfaisant, cela ne fonctionnait pas :/
    (dans cet ARRAY j'avais défini nom[0]=DFEA, nom[1]=DPRG... puis j'avais mis ça dans la boucle en appelant l'élément comme ci-dessous :

    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
    @echo off
    setlocal enableDelayedExpansion 
    
    :: variable chemin acces
    set AccTmp=D:\test\tmp\
    set AccDepot=D:\test\depot\
    set AccArchive=D:\test\archive\
    set datej=%date:~8,2%%date:~3,2%%date:~0,2%
    
    set nom[0]=DFEA
    set nom[1]=DPRG
    set nom[2]=DPZERO
    set nom[3]=DPCONF
    set nom[4]=EPZERO
    set nom[5]=EPCONF1
    set nom[6]=NFIXOPFI
    set nom[7]=FIXOPFI
    
    
    
    for /r "%AccArchive%" %%i in (%%nom[%%i]%%_%datej%*.txt) do (
    	echo %%~ni
    	call %AccDepot%%%~ni.bat /w
    	set error=0
    	for /r "%AccArchive%" %%i in (%%~ni_%datej%*.txt) do (
    		set nom=%%~nxi & set taille=%%~zi
    		echo -- Fichier : %%~nxi --- Taille : %%~zi octets --
    		if %taille%==0 echo =================== /!\ WARNING /!\ ====================
    		if %taille%==0 set /p error=Le fichier cree "%nom%" est vide (0 octets), voulez-vous continuer? (oui/non) : 
    	)
    	echo.
    )
    pause
    Et le résultat était le même que précédemment, le terminal se fermais directement après lancement :/ .

  5. #5
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    Salut !

    Une structure un peu plus logique :

    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
    @echo off
    setlocal enabledelayedexpansion
    
    
    
    set id=DFEA DPRG DPZERO DPCONF EPZERO EPCONF1 NFIXOPFI FIXOPFI
    
    
    For %%a in (%id%) do (
    	echo traitement de =^> %%a
    	for /f "delims=" %%b in ('dir /b "%%a*" 2^>nul') do (
    		echo trouve =^> %%b %%~zb
    		if "%%~zb"=="0" call:askuser "%%b"
    	)
    )
    
    endlocal
    echo done!!!
    exit/b
    
    :askuser
    cls
    echo =================== /!\ WARNING /!\ ====================
    set /p $reponse=Le fichier cree "%~1" est vide (0 octets), voulez-vous continuer? (oui/non) :
    adapte juste les chemins dans le dir


  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 21
    Par défaut
    Merci

    J'essaye ça tout de suite.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 21
    Par défaut
    Ca fonctionne...
    Mais pas totalement, dans le sens où je n'arrive pas à obtenir la taille du fichiers traité.
    Donc la partie :askuser ne se lance jamais, voici le code modifié :

    Modifications =
    For %%a in (%AccArchive%%id%)
    ('dir /b "D:\test\archive\%%a*.txt" 2^>nul')

    rendu du terminal :
    Nom : 2018-10-30 14_25_13-C__windows_system32_cmd.exe.png
Affichages : 294
Taille : 33,8 Ko

    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
    @echo off
    setlocal enableDelayedExpansion 
    
    :: variable chemin acces
    set AccTmp=D:\test\tmp\
    set AccDepot=D:\test\depot\
    set AccArchive=D:\test\archive\
    set datej=%date:~8,2%%date:~3,2%%date:~0,2%
    
    set id=DFEA DPRG DPZERO DPCONF EPZERO EPCONF1 NFIXOPFI FIXOPFI
    
    For %%a in (%AccArchive%%id%) do (
    	echo traitement de =^> %%a
    	for /f "delims=" %%b in ('dir /b "D:\test\archive\%%a*.txt" 2^>nul') do (
    		echo trouve =^> %%b %%~zb 
    		if "%%~zb"=="0" call :askuser "%%b"
    	)
    )
    pause 
    
    endlocal
    echo done!!!
    exit/b
    
    :askuser
    cls
    echo =================== /!\ WARNING /!\ ====================
    set /p $reponse=Le fichier cree "%~1" est vide (0 octets), voulez-vous continuer? (oui/non) :
    Je n'ai par ailleurs pas compris le sens de ces parties mises en gras :
    ('dir /b "D:\test\archive\%%a*.txt" 2^>nul')
    echo trouve =^> %%b %%~zb

    Et ce, malgré mes recherches sur internet, auriez-vous des liens menant à de la documentation sur cela ?

  8. #8
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    La première boucle n'étant pas dependante d'un chemin, mias uniquement des ID a chercher dans le nom
    , utilise uniquement %id%, pour la deuxième boucle il te faut le chemin donc,

    essaye qqe chose comme ça :


    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
    @echo off
    setlocal enableDelayedExpansion 
    
    :: variable chemin acces
    set AccTmp=D:\test\tmp\
    set AccDepot=D:\test\depot\
    set AccArchive=D:\test\archive\
    set datej=%date:~8,2%%date:~3,2%%date:~0,2%
    
    set id=DFEA DPRG DPZERO DPCONF EPZERO EPCONF1 NFIXOPFI FIXOPFI
    
    For %%a in (%id%) do (
    	echo traitement de =^> %%a
    	for /f "delims=" %%b in ('dir /b "%AccArchive%%%a*.txt" 2^>nul') do (
    		echo trouve =^> %%b %%~zb 
    		if "%%~zb"=="0" call :askuser "%%b"
    	)
    )
    pause 
    
    endlocal
    echo done!!!
    exit/b
    
    :askuser
    cls
    echo =================== /!\ WARNING /!\ ====================
    set /p $reponse=Le fichier cree "%~1" est vide (0 octets), voulez-vous continuer? (oui/non) :
    pour le 2>nul c'est juste pour redirectionner le stderr vers nul pour qu'il n'affiche pas à l'écran si il ne trouve pas de fichier.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 21
    Par défaut
    Bonjour,

    Le code fonctionne mais ne retourne toujours pas la taille du fichier trouvé (voire image), en revanche, je viens d'y penser mais dans archive il y aura toutes les archives des jours précédents donc il faut que le script puisse vérifier l'existence des fichiers créés au cours de la journée, et non pas vérifier les noms/taille des fichiers des jours précédant.

    Là se trouve la difficulté dans cette portion de code (en tous cas pour moi ^^' )

    Nom : 2018-10-31 08_39_57-[Batch].png
Affichages : 285
Taille : 28,6 Ko

    Exemple du contenu du répertoire archive :
    Nom : 2018-10-31 10_26_14-.png
Affichages : 294
Taille : 43,9 Ko

    On voit donc que beaucoup de message vont se stocker ici.
    c'est pourquoi je persiste à penser qu'une sélection par le nom du fichier est la meilleure solution ?

  10. #10
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    Essaye de modifier la boucle de cette manière pour le problème de taille


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For %%a in (%id%) do (
    	echo traitement de =^> %%a
    	pushd "%AccArchive%"
    	for /f "delims=" %%b in ('dir /b "%%a*.txt" 2^>nul') do (
    		echo trouve =^> %%~b %%~zb
    		if "%%~zb"=="9" call :askuser "%%b"
    	)
    	popd
    )

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 21
    Par défaut
    Rendu avec changements effectués :
    Nom : 2018-10-31 10_50_29.png
Affichages : 298
Taille : 41,5 Ko

    Merci beaucoup, maintenant je vais essayer de voir pour faire le tri pour traiter les fichiers de la journée en cours.
    Je reviendrai vers vous si je rame dans la purée.
    Images attachées Images attachées  

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 21
    Par défaut
    J'ai trouvé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For %%a in (%id%) do (
    	echo traitement de =^> %%a
    	pushd "%AccArchive%"
    	for /f "delims=" %%b in ('dir /b "%%a_%datej%*.txt" 2^>nul') do (
    		echo trouve =^> %%~b %%~zb
    		if "%%~zb"=="9" call :askuser "%%b"
    	)
    	popd
    )
    Merci infiniment pour toute l'aide apportée sachadee
    Si avant je ne croyais pas à l'existence des génies, mon avis a changé, je passe le sujet en résolu

    Bonne fin de journée et bonnes fêtes d'halloween si tu le fêtes.

    Ryo S.

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 21
    Par défaut EDIT ! PROBLEME
    Re-bonjour,
    après avoir testé dans toute sa longueur le script, je me suis rendu compte que lors de l'exécution, il ne traite pas le dernier fichier créé (voir image ci-dessous) :

    Nom : img.png
Affichages : 323
Taille : 88,4 Ko

    Je pense que la boucle s'arrete avant le traitement mais je ne vois pas comment la prolonger pour qu'elle puisse prendre en compte le dernier fichier :

    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
    :integration
    set datej=%date:~8,2%%date:~3,2%%date:~0,2%
    echo.
    
    
    set id=DFEA DPRG DPZERO DPCONF EPZERO EPCONF1 NFIXOPFI FIXOPFI
    
    For %%a in (%id%) do (
    	call %AccBat%%%a.bat /w
    	pushd "%AccDepot%"
    	for /f "delims=" %%b in ('dir /b "%%a_%datej%*.txt" 2^>nul') do (
    		echo -- Fichier : %%~b --- Taille : %%~zb octets --
    		if "%%~zb"=="0" call :askuser "%%~b"
    		echo ----------------------------------------------------
    		echo.
    	)
    	popd
    )
    pause 
    
    endlocal
    
    :askuser
    echo =================== /!\ WARNING /!\ ====================
    set /p reponse=Le fichier cree "%~1" est vide (0 octets), voulez-vous continuer? (oui/non) : 
    if /i %reponse%==non echo -- -- -- & echo Fin de l'integration ! & echo -- -- -- & timeout /t 2 > nul & exit
    Voilà mon code final (la partie nous intéressant en tt cas.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/10/2014, 17h02
  2. Problème avec les boucles for
    Par Marie_7 dans le forum MATLAB
    Réponses: 4
    Dernier message: 06/09/2012, 10h56
  3. Utilisation plusieurs boucles For imbriquées
    Par stick25 dans le forum Général VBA
    Réponses: 2
    Dernier message: 07/04/2010, 18h00
  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. problème avec les array en pl/pgsql
    Par nico31120 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 04/03/2005, 16h04

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