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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ?

+ 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