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 assignation de variables dans boucle [Batch]


Sujet :

Scripts/Batch

  1. #1
    DIE
    DIE est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 101
    Points : 66
    Points
    66
    Par défaut Problème avec assignation de variables dans boucle
    Bonjour à tous,
    Je tente de faire fonctionner un script BATCH depuis plusieurs jours, j'ai bien avancé mais là je bloque.
    Le script ce dessous va faire deux passages dans la boucle avec les fichiers suivants :
    toto@toto.fr-tigre.xml.20316552.tar.gz
    titi@titi.fr-tigre.xml.20316552.tar.gz

    1)
    Lors du premier passage tout ce passe bien dans les assignations SAUF pour la variable !MAIL! qui est utilisée
    dans la commande blat.exe , cette variable n'est pas substituée et je ne comprends pas pourquoi

    2)
    Lors du traitement du second fichier rien ne va plus les variables ne sont plus affectées ce qui donne à l'exécution
    Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Nom du fichier zip : !FICZIP!
    Nom du fichier tar : !FICTAR!
    D:\graphviz\SOSctm2graphviz\scripts>SET MAIL=!FICZIP!
    Le fichier spécifié est introuvable.
    gzip: D:\Control-M\Migration_6.1_to_6.3\xml_migre_graphviz_prod\TEST\!FICZIP!.gz
    : No such file or directory
    tar: Cannot open !FICTAR!: No such file or directory
    tar: Error is not recoverable: exiting now
    Impossible de trouver D:\Control-M\Migration_6.1_to_6.3\xml_migre_graphviz_prod\
    TEST\!FICTAR!
    Le nom de fichier existe déjà, ou le fichier
    est introuvable.



    Voici mon script

    Code BAT : 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
    SetLocal EnableDelayedExpansion EnableExtensions
     
    @echo off
     
    SET     FIC_XML=D:\Control-M\Migration_6.1_to_6.3\xml_migre_graphviz_prod\TEST
    SET FIC_XML_OUT=%FIC_XML%\XML
    SET     PDF_OUT=%FIC_XML%\PDF
     
    for %%a in (%FIC_XML%\*.gz) do (
    SET FICZIP=%%~nxa
    SET FICTAR=%%~na
    echo Nom du fichier zip : !FICZIP!
    echo Nom du fichier tar : !FICTAR!
     
     
    REM Recuperation de l'adresse mail dans le nom du fichier
    for /f "tokens=1 delims=-" %%b in ("!FICZIP!") do SET MAIL=%%b
     
    REM dezip
    copy %FIC_XML%\!FICZIP! %PDF_OUT%
    gzip -df %FIC_XML%\!FICZIP!
     
    REM detar
    D:
     cd %FIC_XML%
     tar -xvf !FICTAR!
     del !FICTAR!
     
     move *.xml %FIC_XML_OUT%
     
    REM Creation des PDF à partir des xml , envoi par mail puis copie dans repertoire Organigrammes
    for %%i in (%FIC_XML_OUT%\*.xml) do (
    	D:\graphviz\SOSctm2graphviz\scripts\ctm2graphviz -DefTableFileName=%%i
    	D:\graphviz\release\bin\dot -Tpdf D:\graphviz\SOSctm2graphviz\tmp\DOT\%%~ni.dot -o %PDF_OUT%\%%~ni.pdf
     
     
    copy %PDF_OUT%\%%~ni.pdf "V:\met\Exploit\Developpement exploit\Organigrammes\MVS\_Organigrammes_ESSAI"
    echo FIN DE COPY
    blat.exe -serverSMTP msg-store.ccmsa.msanet -t !MAIL! -subject "Organigramme %%~ni" -body "%%~ni" -attach %PDF_OUT%\%%~ni.pdf,%FIC_XML_OUT%\%%~ni.xml >> %TMP%\ctm_to_graphviz_error.log 2>&1
    echo FIN DE BLAT
     
    del %FIC_XML_OUT%\%%~ni.xml
    del %PDF_OUT%\%%~ni.pdf
     
    pause
    )
    pause
    )
    endlocal
    ############
    # KSH sous AIX #
    ############

  2. #2
    Membre éclairé Avatar de devilsnake88
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2013
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 453
    Points : 809
    Points
    809
    Par défaut
    Bonjour,

    Pour débugger ton code je t'invite à agir de la sorte:
    *Message d'erreur: "Nom du fichier zip : !FICZIP!"*
    Ok donc là il m'affiche la variable et non pas le contenu, je sais que pour afficher le contenu d'une variable, suivant le contexte je peux utiliser "!" ou "%".
    Donc je vais faire ceci:
    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SET "FICZIP=%%~nxa"
    ...
    echo Nom du fichier zip : !FICZIP! - %FICZIP%
    pause
    Si le résultat est:
    Nom du fichier zip : !FICZIP! - LeFichierVoulu
    C'est que tu n'as pas compris l'utilisation de "!" ou "%" (perso je ne l'ai toujours pas assimilée donc je "m'amuse" à faire des echo et des pause mais chute il ne faut pas le dire! xD

    Après je te conseille de mieux organiser ton code, à savoir commencer par "@echo off & cls" et seulement ensuite définir ton "SetLocal".
    Pareil tes "SET", essaye de mettre des guillemets car parfois avec des espaces dans les noms de variables par exemple le code peut t'embêter donc formate les comme ceci:
    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    SET "Ma_Variable=%UneValeur%"

    Et surtout INDENTE BIEN TON CODE!
    Parce que des boucles imbriquées sans indentation c'est pas le top pour s'y retrouver.
    ________________________________________________________________
    N'oublie pas de faire une sauvegarde avant d'exécuter des scripts...
    Si j'ai ton problème, un petit fait toujours plaisir!
    ________________________________________________________________

  3. #3
    DIE
    DIE est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 101
    Points : 66
    Points
    66
    Par défaut
    Merci de votre réponse rapide

    J'ai essayé toutes vos recommandations mais le résultat est toujours le même et les
    %FICZIP% et %FICTAR% sont à blanc (voir ci-dessous)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     echo Nom du fichier zip : !FICZIP! -
     echo Nom du fichier tar : !FICTAR! -
    J'ai bien mis tous mes SET entre guillemets mais je m'assure toujours de ne pas avoir
    d'espaces dans le nom d'une variable

    J'ai essayé d'indenté pour une meilleure lisibilité mais POWERBATCH n'accepte pas les
    tabulations (mais je ne sais pas encore trop bien m'en servir)

    Je reprécise qu'à la première exécution de la boucle TOUTES les variables (dont FICZIP et FICTAR)
    sont bien substituées à part la variable !MAIL! dans blat.exe
    mais que la seconde fois cela ne fonctionne plus, c'est pour cela que j'ai
    mis un SetLocal EnableDelayedExpansion EnableExtensions (faut-il le placer plusieurs fois ?)

    Merci d'avance
    ############
    # KSH sous AIX #
    ############

  4. #4
    Membre éclairé Avatar de devilsnake88
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2013
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 453
    Points : 809
    Points
    809
    Par défaut
    Poste ton code à jour s'il te plait, je prendrais plus de temps pour regarder.
    Si tu peux ajouter un exemple de fichier à traiter ce serait un gros plus.
    ________________________________________________________________
    N'oublie pas de faire une sauvegarde avant d'exécuter des scripts...
    Si j'ai ton problème, un petit fait toujours plaisir!
    ________________________________________________________________

  5. #5
    DIE
    DIE est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 101
    Points : 66
    Points
    66
    Par défaut
    Super merci

    Mon code est à jour dans le premier post, tu as juste à mettre un REM devant

    D:\graphviz\SOSctm2graphviz\scripts\ctm2graphviz
    D:\graphviz\release\bin\dot
    blat.exe

    Pour les exemples de fichier ils sont aussi dans mon premier post, par contre
    c'est un fichier xml taré et gzippé
    toto@toto.fr-tigre.xml.20316552.tar.gz
    titi@titi.fr-tigre.xml.20316552.tar.gz
    ############
    # KSH sous AIX #
    ############

  6. #6
    Membre éclairé Avatar de devilsnake88
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2013
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 453
    Points : 809
    Points
    809
    Par défaut
    Alors,
    Prend l'habitude d'utiliser les guillemets quand tu utilises des chemins.
    Mon code de test:

    Code bat : 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
    @echo off & cls
    setlocal EnableDelayedExpansion
    
    set "current_path=%~dp0"
    set "current_path_modified=%current_path:~0,-1%"
     
    for %%a in ("%current_path_modified%\*.gz") do (
    	SET "FICZIP=%%~nxa"
    	SET "FICTAR=%%~na"
    	echo Nom du fichier zip : !FICZIP!
    	echo Nom du fichier tar : !FICTAR!
     
    	REM Recuperation de l'adresse mail dans le nom du fichier
    	for /f "tokens=1 delims=-" %%b in ("!FICZIP!") do (
    		SET "MAIL=%%b"
    		echo MAIL = !MAIL!
    	)
    )
    
    endlocal
    pause
    exit
    Retourne:
    PS: je ne peux pas télécharger tes fichiers car le forum détecte une adresse mail du coup il l’interprète comme tel et sort une URL en mailto: mais bon je ne pense pas que ce soit utile ^^
    ________________________________________________________________
    N'oublie pas de faire une sauvegarde avant d'exécuter des scripts...
    Si j'ai ton problème, un petit fait toujours plaisir!
    ________________________________________________________________

  7. #7
    DIE
    DIE est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 101
    Points : 66
    Points
    66
    Par défaut
    Mille merci cela fonctionne, le fait de mettre des guillements dans les SET "MAIL=toto" semble faire la diférence
    Le BATCH me semble bien moins souple que le BASH mais je progresse
    à bientôt

    ps : Pourrais-tu m'expliquer la syntaxe de ton script
    set "current_path=%~dp0"
    set "current_path_modified=%current_path:~0,-1%"
    ############
    # KSH sous AIX #
    ############

  8. #8
    Membre éclairé Avatar de devilsnake88
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2013
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 453
    Points : 809
    Points
    809
    Par défaut
    set "current_path=%~dp0" -> Retourne le chemin depuis lequel ton .bat est exécuté et se termine par "\" exemple:

    J'exécute mon .bat depuis C:\Users\TrikzMe\Desktop\monscript.bat
    %~dp0 = "C:\Users\TrikzMe\Desktop\"
    set "current_path_modified=%current_path:~0,-1%"
    et %current_path_modified% = %~dp0 MOINS le dernier caractère donc "\"
    %current_path_modified% = "C:\Users\TrikzMe\Desktop"

    Voila ^^
    ________________________________________________________________
    N'oublie pas de faire une sauvegarde avant d'exécuter des scripts...
    Si j'ai ton problème, un petit fait toujours plaisir!
    ________________________________________________________________

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

Discussions similaires

  1. Problème d'affectation de variable dans une boucle
    Par gabbf29 dans le forum Général Java
    Réponses: 28
    Dernier message: 03/10/2013, 14h11
  2. [Batch] problème d'affectation de variable dans boucle imbriquée
    Par fred_04510 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 04/02/2012, 09h30
  3. Réponses: 1
    Dernier message: 29/09/2009, 15h43
  4. Problème avec variable dans boucle DO WHILE
    Par bandit_debutant dans le forum Langage
    Réponses: 13
    Dernier message: 25/02/2008, 17h34
  5. problème avec masque de saisie dans table
    Par porki dans le forum Access
    Réponses: 6
    Dernier message: 13/10/2004, 09h58

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