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 :

test de la présence de fichiers ou de répertoires dans un répertoire racine.


Sujet :

Scripts/Batch

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Points : 17
    Points
    17
    Par défaut test de la présence de fichiers ou de répertoires dans un répertoire racine.
    Bonjour,
    Je commence en batch, et je galère depuis 2 jours pour en créer un!

    Je me retrouve bloqué sur le test de la présence de fichiers ou de répertoires dans un répertoire "xx"
    En effet, je voudrais vérifier toute les 10mn par une tache planifiée si il y a des fichiers et/ou répertoires, dans le répertoire "xx". Et si il y a quelque chose à déplacer (fichiers ou répertoires) je veut envoyer un mail avec le soft "sendmail" et lancer la commande de déplacement de fichiers.
    Par contre, je ne veut pas envoyer un mail si il n'y a rien à déplacer dans "xx".

    J'ai essayé ça sans succès:

    Set Source=e:\ftp\xx
    Set Destination=e:\ftp\yy
    If existe %source%\*.* (
    For /F "Tokens=* Delims=" %%I In ('Dir /B "%_Source%"') Do Move "%_Source%\%%I" "%_Destination%"
    sendmail.exe.....
    ) else (
    exit
    )

    Évidement je ne connait pas les noms des fichiers ou répertoires qui peuvent être présent dans "xx"

    Seul le test de la présence de fichier ou de répertoires dans e:\ftp\xx" semble ne pas fonctionner.

    Merci d'avance pour votre aide!

  2. #2
    Membre averti

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Points : 387
    Points
    387
    Billets dans le blog
    1
    Par défaut
    A mon avis il manque des " autour de ton nom de fichier et je ne suis pas sûr que les meta-caractères marchent. Personnellement, je ferai un dir /b du répertoire, puis j'en compterai le nombre de ligne pour savoir si un nouveau fichier est apparu.

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    effectivement, j'ai quasiment réussit à faire ce que je voulais en comptant les fichiers.

    Plus que 2 problèmes:
    Si un répertoire dans %destination% porte le même nom que que dans %source% alors il ne veut pas déplacer le répertoire dans %source% et m'affiche: accès refusé.
    Pourtant, j'ai bien ajouté l'option /Y pour la commande move.

    Ensuite, il n'y a plus que l'ajout des noms des fichiers dans le corps de mon message qui ne fonctionne pas! pourtant j'y été arrivé pendant un moment....

    J'utilise un 1er batch qui appel un second batch "move.bat":

    Set Source=e:\ftp\xx
    Set Destination=e:\ftp\yy
    For /f "tokens=*" %%a in ('dir /B "%Source%\"') Do Set /A Compte+=1
    If "%Compte%"=="" (
    goto FIN2
    ) else (
    call move.bat
    )

    :MAIL
    rem Parametres de l'email à envoyer pour sendmail
    set sujet=De nouveaux PV sont arrivés sur le FTP!
    set exp=xxxxxx
    set destinataire=xxxxxxxx
    set corps=corps.txt
    set port=25
    set smtp=xxx.xxx.xxx.xxx
    sendmail.exe /m:%corps% /u:%destinataire% /t:%sujet% /e:%exp% /l /p:%port% /s:%smtp%

    :FIN
    --------------------------------------------------------

    Fichier batch "move.bat":
    ------------------------
    Set Source=e:\ftp\xx
    Set Destination=e:\ftp\yy
    del %destination%\corps.txt
    title >%destination%\corps.txt
    for /f "Tokens=4* delims=\" %%a in ('dir %Source%\ /B') do echo %%a>>%destination%\corps.txt
    Set DD=%date:~0,2%
    Set MM=%date:~3,2%
    Set YY=%date:~6,4%
    echo "date du jour: %DD%-%MM%-%YY%"
    mkdir "%Destination%\%YY%\%MM%\%DD%\"
    For /F "Tokens=* Delims=" %%i In ('Dir /B "%Source%"') Do Move /y "%Source%\%%i" "%Destination%\%YY%\%MM%\%DD%\"

  4. #4
    Membre averti

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Points : 387
    Points
    387
    Billets dans le blog
    1
    Par défaut
    Pour ton problème avec move, c'est inhérent à la commande on dirait (j'ai reproduis). Utilise l'equivalent unix, mv.exe.

    sur cette ligne, 2 vulnérabilité : echo %%a>>%destination%\corps.txt

    1. Pas de guillement dans le nom de fichier.
    2. si %%a se termine par un chiffre se sera intéprété comme étant une sortie (1> c'est le stdout, 1, le stderr,...)

    Peut être es tu dans l'un de ces 2 cas ?

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    je comprends pas ce que tu veut me dire par:

    1. Pas de guillemets dans le nom de fichier.
    2. si %%a se termine par un chiffre se sera interprété comme étant une sortie (1> c'est le stdout, 1, le stderr,...)

    dans mes test, il n'y a pas de chiffre à la fin, ni de guillemets pour la variable %%a. Mais il pourrait arriver qu'il y ai un chiffre à la fin un jour...

    Comment corriger?

    J'ai du mal à comprendre quand il faut mettre des ' ou des "

  6. #6
    Membre averti

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Points : 387
    Points
    387
    Billets dans le blog
    1
    Par défaut
    En fait, batch est vulnérable au espace dans le nom de fichier, donc chaque nom de fichier doit être entouré de guillemets.

    Aprés si tu as des erreurs, il faut faire du debug en analysant la sortie des paramètres des commandes qui foirent, avec de simple echo P1 [%parametre1%]...

  7. #7
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    Ca y est, tout fonctionne bien.

    Le dernier soucis que j'ai c'est que avec la commande move, je n'arrive pas à déplacer un répertoire (avec un fichier.txt dedans) de %source% vers %destination% si il existe déjà un répertoire avec le même nom dans %destination%. J'ai un message "Accès refusé".
    je vois pas de quoi ça vient vu que j'ai mis /y pour répondre par oui à l'écrasement de fichier! Il n'a pas l'air de faire pareille pour les répertoires.

    Ou bien, j'ai un problème dans mon batch: Je demande de le remplacer alors que peut-être il est utilisé par quelque chose dans mon batch. Mais je vois pas où!

    pour résumer:
    Donc dans le répertoire source "xx" j'ai un répertoire avec un fichier.txt: e:\ftp\xx\a\fichier.txt
    et dans mon répertoire de destination "yy", j'ai aussi un répertoire "a" mais vide: e:\ftp\yy\a\
    Et bien le déplacement du fichier.txt ne se fait pas et reste dans la source!!!

    j'ai essayé dans un batch moveftp.bat et voilà ce que ça me répond:

    E:\FTP\script>rem Decomposition de la date
    E:\FTP\script>Set DD=02
    E:\FTP\script>Set MM=12
    E:\FTP\script>Set YY=2010

    E:\FTP\script>rem Creation du rÚpertoire annÚe\Mois\jour en utilisant la date du
    jour
    E:\FTP\script>mkdir "e:\ftp\yy\2010_12\02\"
    Un sous-répertoire ou un fichier e:\ftp\yy\2010_12\02\ existe déjà.

    E:\FTP\script>rem dÚplacement des fichiers et rÚpertoires de e:\ftp\xx vers e:\f
    tp\yy saisis dans le fichier sendmailFTP.bat
    E:\FTP\script>For /F "Tokens=* Delims=" %i In ('Dir /B "e:\ftp\xx"') Do Move /y
    "e:\ftp\xx\%i" "e:\ftp\yy\2010_12\02\"

    E:\FTP\script>Move /y "e:\ftp\xx\a" "e:\ftp\yy\2010_12\02\"
    Accès refusé.

    E:\FTP\script>pause
    Appuyez sur une touche pour continuer...

  8. #8
    Membre averti

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Points : 387
    Points
    387
    Billets dans le blog
    1
    Par défaut
    Es-ce que tu essaie de déplacer un répertoire sur un emplacement ou se trouve déjà un répertoire similaire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    E:\FTP\script>Move /y "e:\ftp\xx\a" "e:\ftp\yy\2010_12\02\"
    Accès refusé.

  9. #9
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    oui c'est bien le problème!
    En fait dans e:\ftp\yy\2010_12\02\ il y a un répertoire qui se nomme aussi (idem que la source).

    Ce que je veut faire, c'est que si le répertoire "a" dans la source existe aussi en destination alors je veut déplacer tout le contenu du répertoire source "a" dans le répertoire de destination "a" et supprimer "a" de la source sans supprimer son répertoire parent.

    Sinon j'ai aussi essayé avec robocopy:
    "%robocopy%\robocopy.exe" "%Source%" "%Destination%\%YY%_%MM%\%DD%" /E /move

    Là si les fichiers et répertoires à déplacer existent déjà dans la destination, alors rien ne se passe. Et si les si les fichiers et répertoires n'existent pas, il me déplace bien tout (répertoire) parent compris! alors que je ne veut pas toucher au répertoire parent.

    Même avec l'option exclure un répertoire (ici le répertoire parents ça ne fonctionne pas:
    "%robocopy%\robocopy.exe" "%Source%" "%Destination%\%YY%_%MM%\%DD%" /E /move /xd xx

  10. #10
    Membre averti

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Points : 387
    Points
    387
    Billets dans le blog
    1
    Par défaut
    Tu as l'option mov qui pourrait correspondre à ton besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /MOV :: MOVe files (delete from source after copying).
    Et sinon as tu essayé Mv (unixutils) comme je te l'ai conseillé plus bas pour voir ?

  11. #11
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    non j'ai pas essayé Mv désolé, car j'ai pas trouvé le mv.exe

    Par contre l'option /mov ne conviendrai pas car ça ne gèrerait pas les répertoires.


    J'ai finis par trouver une solution peut orthodoxe mais qui fonctionne.
    j'ai en fait crée un répertoire dans mon répertoire source et dans robocopy, j'ai exclu ce répertoire du "move" avec l'option /xd
    Donc comme il reste un répertoire, il ne supprime pas le répertoire parent. C'est la seul astuce que j'ai trouvé.

  12. #12
    Membre averti

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Points : 387
    Points
    387
    Billets dans le blog
    1
    Par défaut
    mv est disponible dans les unixutils. Le lien est dans ma signature.

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/06/2015, 10h21
  2. Réponses: 2
    Dernier message: 08/07/2012, 22h07
  3. Réponses: 38
    Dernier message: 26/09/2008, 17h46
  4. Réponses: 3
    Dernier message: 04/07/2008, 11h07
  5. Réponses: 2
    Dernier message: 12/03/2006, 23h41

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