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 :

ajouter la date de dernière modification au nom du fichier [Batch]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 6
    Par défaut ajouter la date de dernière modification au nom du fichier
    Bonjour,

    Je début en Batch donc mes connaissances sont assez limiter.

    Mon objectif est de copier plusieurs fichiers .txt d’un dossier vers un autre.

    Dans le dossier destination je voudrais ajouter la date de dernier modification en écriture au début du nom du fichier.

    Donc dossier source :
    Toto.txt
    Tata.txt

    Dossier destination :

    21025024Toto.txt
    21024015Tata.txt

    En parcourant plusieurs forum j’ai réussi à écrire ceci :

    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
     
    @echo off & setlocal enabledelayedexpansion enableextensions
     
    for %%x in (*.txt.*) do (
     
    dir /TW %%x  | find "/" > tmp.txt
    
    SET datetmp=
    set reverse=
    
    call :PROCESS
    set reverse
    
    copy "%%~nxx" "C:\Documents and Settings\dhumiere\Mes documents\Gestion de logs\Batch\test2\%reverse%%%~nxx" 
    )
    
    pause & endlocal & goto:eof
     
    :PROCESS
    
    FOR /F "tokens=1-4 delims= " %%i in (tmp.txt) do set datetmp=%%i 
    SET datetmp=%datetmp:/=%
    call :reverse "%datetmp%"
    del tmp.txt
    
    :reverse
    for /f "tokens=1* delims=:" %%a in ('
        "%comspec% /u /c echo:%~1|more|findstr /o ."
     ') do set "reverse=%%b!reverse!"
    goto:eof
    En se centrant sur le déplacement j’ai utilisé ceci (qui fonctionne) :

    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
     
    @echo off & setlocal enabledelayedexpansion enableextensions
    
    SET _VAR=%date%
    
    SET _VAR=%_VAR:/=%
     
    call :reverse "%_VAR%"
    
    set reverse 
    
    for %%x in (*.txt.*) do (
    copy "%%~nxx" "C:\Documents and Settings\dhumiere\Mes documents\Gestion de logs\Batch\test2\%reverse%%%~nxx"
     )
     
    pause & endlocal & goto:eof
     
    :reverse
    for /f "tokens=1* delims=:" %%a in ('
        "%comspec% /u /c echo:%~1|more|findstr /o ."
     ') do set "reverse=%%b!reverse!"
    goto:eof
    Mais dès que je déplace le call :reverse "%_VAR%" dans la boucle for la date n’est plus ajouter au début du fichier.

    J’espère avoir été claire et si quelque saurais me dire pourquoi ou comment contourner le problème sa m’aiderais beaucoup.

    Merci d’avance.

  2. #2
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Salut,

    Ta date de sortie n'a pas un format conventionnel 21025024 (~), regarde la faq, car pour ça, la commande for s'auto-suffit.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 6
    Par défaut
    Citation Envoyé par minnesota Voir le message
    Salut,

    Ta date de sortie n'a pas un format conventionnel 21025024 (~), regarde la faq, car pour ça, la commande for s'auto-suffit.
    Bonjour,

    Merci de ta réponse.

    le format de date a été mal écrit effectivement, elle est completement inverse 21025042 .

    Mais je ne trouve pas dans la faq de topic qui traite se point (ou je ne sais pas cherche sa marche aussi ).

    "La commande FOR s'auto-suffit" es-que tu pourrais développer je comprend pas a quoi tu fait référence.

    Un de mes collègue a soulevé la problématique des boucles imbriques es-que sa pourrais joué ?

  4. #4
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Pour la faq, ici -> http://windows.developpez.com/faq/ba...name_with_date

    Pour for, elle se suffit parce qu'elle te permet de retrouver la date de dernière modification du fichier grace à la substitution de références de variables, alors que toi tu passes par la date courante du système.

    tape for /? dans ta console pour plus de détail.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 6
    Par défaut
    Bonjour,

    Merci de votre réponse en suivant votre lien j'ai pus simplifier grandement mon code.

    Donc pour la copie et l'ajouter de la date du jour sa donne sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @echo off & setlocal enabledelayedexpansion enableextensions
    
    for %%x in (*.txt.*) do (
    copy "%%~nxx" "C:\Documents and Settings\dhumiere\Mes documents\Gestion de logs\Batch\test2\"%date:~6,4%%date:~3,2%%date:~0,2%%%~nxx"
     )
     
    pause & endlocal & goto:eof
    Maintenant se pause la problématique que je veut la date de dernière modification du fichier.

    En suivant votre conseil j'ai consulté le help de la commande for la partie qui nous intéresse ici est (j'ai tronque les éléments qui ne nous intéresse pas):

    Enfin, vous pouvez utiliser la commande FOR /F pour analyser les données en sortie d'une commande.

    Faites ceci en plaçant des guillemets inversés autour de ensemble-fichiers entre les parenthèses. Elle sera traitée comme une ligne de commande transmise à un CMD.EXE enfant et la sortie est gardée en mémoire et analysée comme s'il s'agissait d'un fichier. Ainsi l'exemple suivant*:

    FOR /F "usebackq delims==" %i IN (`ensemble`) DO @echo %i

    énumérerait les noms de variables d'environnement de l'environnement en cours.

    De plus, la substitution de références de variables FOR a été améliorée. Vous pouvez maintenant utiliser la syntaxe optionnelle suivante*:

    %~tI - étend %I en date/heure du fichier

    Dans les exemples ci-dessus %I peuvent être remplacés par d'autres valeurs valides. La syntaxe %~ se termine par un nom de variable FOR valide.
    Le choix de noms de variables en majuscules comme %I facilite la lecture et empêche toute confusion avec les modificateurs qui ne tiennent pas compte de la casse.
    Pour pouvoir utiliser %~tI il faut être dans une boucle FOR /F !?

    Donc il faut que je reparte sur des boucles imbriques pour faire le traitement de la date puis la copie ou modifier le FOR que j'utilise pour ajouter /F et imbriquer la gestion de la date ?

    J'ai essai les deux solution mais à chaque fois mon programme plante.

    je planche sur les boucles imbriques j'ai fait sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @echo off & setlocal enabledelayedexpansion enableextensions
    
    FOR %%x IN (*.txt.*) DO (
    
    FOR /F "usebackq delims==" %%i IN ('%%x') DO @echo %%i
    
    copy "%%~nxx" "C:\Documents and Settings\dhumiere\Mes documents\Gestion de logs\Batch\test2\"%%i%%~nxx"
     )
     
    pause & endlocal & goto:eof
    Mon problème ici est le passage de '%%x' dans le IN du second FOR.
    Si je met un nom de fichier sa fonction mais si je met une variable le second FOR ne fonctionne plus se quoi que je mette pour encadre %%x (j'ai testé : "%%x" '%%x' `%%x` '"%%x"' ^'%%x'^).

    des suggestions ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 6
    Par défaut
    Bonjour,

    Finalement je suis passer par un autre procédé.

    ce qui donne :

    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
    @echo off & setlocal enableExtensions
    
    for %%f in (test1\*.TXT) do (
      set FILE=%%~nxf
      set TIMESTAMP=%%~tf
      call :processFile
    )
    pause 
    goto end
    
    :processFile
    set FDD=%TIMESTAMP:~0,2%
    set FMM=%TIMESTAMP:~3,2%
    set FYY=%TIMESTAMP:~6,4%
    
    :end
    
    copy "%FILE%" "C:\Documents and Settings\dhumiere\Mes documents\Gestion de logs\Batch\test2\"%FYY%%FMM%%FDD%%FILE%"
    
    endlocal&&goto :eof
    Voila pour ceux que sa pourrais intéréssé.

  7. #7
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Dans l'optique de ce que tu as écrit précédemment, on aurait quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @echo off
    for %%f in (*.txt) do (
      for /f "tokens=1,2,3,* delims=/-. " %%j in ("%%~tf") do (
        echo copy /b "%%~f" "chemin\%%~l%%~k%%~j%%~f"
      )
    )
    ou encore (pour jouer)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @echo off
    for %%f in (*.txt) do ^
    for /f "tokens=1,2,3,* delims=/-. " %%j in ("%%~tf") do ^
    echo copy /b "%%~f" "chemin\%%~l%%~k%%~j%%~f"
    mais il est tout aussi possible de se contenter d'un seul for, et par la même occasion, gagner en rapidité de traitement. Je te laisse faire...

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

Discussions similaires

  1. [HP-UX] Comparaison date de dernière modif
    Par seawolfm dans le forum Unix
    Réponses: 2
    Dernier message: 31/05/2007, 22h14
  2. Réponses: 2
    Dernier message: 17/12/2005, 20h56
  3. Date le dernière modification
    Par np-petot dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 07/10/2005, 16h07
  4. [Dates] Listage + dernière modification
    Par Goshi dans le forum Langage
    Réponses: 3
    Dernier message: 02/10/2005, 14h27
  5. date de dernière modification d'une table ?
    Par NiBicUs dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/12/2004, 18h11

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