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 :

Tronquer un nom de fichier [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 75
    Points
    75
    Par défaut Tronquer un nom de fichier
    Bonjour,

    Je cherche à faire un script pour tronquer un nom de fichier type, le problème est que le logiciel propriétaire (et plus maintenu à jour par l'editeur) ne gère plus l’incrémentation du quantième de l'année et l'ajoute tout les jours, donnant des fichiers à rallonge et empêchant le traitement:

    Fichier.dat.134 passera en fichier.dat.134.135 fichier.dat.134.135.136...

    Je voudrai donc faire un tronquage du nom en lui même, j'ai déjà trouvé pour tronquer dans un fichier, mais pas le nom.
    Ici il s'agirait de tronquer apres le ".dat" jusqu'au 4 derniers caractères ".quantieme" . Le nombre de caractère avant le .dat est toujours le même.

    Un rename est possible mais dans l'idée il me faut le moyen d'extraire le quantième de l'année à partir de la date, et là...Même soucis, pas de piste solide sur le sujet.

    Si une personne à déjà fait cela pour me donner une piste soit sur le tronquage du nom ou l'extraction du quantième je suis donc preneur.

    Merci

  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
    Points : 3 768
    Points
    3 768
    Par défaut
    Salut,

    si tu connais la position de la valeur à tronquer utilise la substitution:

    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
    
    set test=123456789
    
    :::Les trois derniers caractères
    
    echo %test:~-3%
    
    :::les trois caractères du milieu
    
    echo %test:~3,-3%
    
    :::les trois premiers
    
    echo %test:~0,3%
    Amicalement
    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  3. #3
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 75
    Points
    75
    Par défaut
    C'est surtout que les 3 derniers caractères changent tout les jours, principe du quantième.
    Dans le cadre d'une fin fixe ok pour la préciser comme ci dessous. Mais ça n'ira pas pour moi sur le fait qu'elle s’incrémente, donc change.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    set test=prelevement_imp.dat.136.137
    :::Les trois derniers caractères
    echo %test:~-3%
    :::les trois premiers
    echo %test:~0,19%
    echo %test:~0,19%.%test:~-3%
    for %%x in (prelevement*.*) do rename "%%~fx" "%test:~0,19%.%test:~-3%"
    Sous linux j'aurai simplement fait un truc du genre find $path -name 'prelevement_imp.dat.*'Mais sous DOS je galère un peu plus dû à la restriction de mes connaissances

    Si ça peut aider, c'est le seul fichier dans cet emplacement, le reste du contenu est 3 repertoires, donc je ne sais pas si la récupération du nom fichier reste faisable sous DOS


    EDIT: J'en suis actuellement à cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @echo off
    
    ::récupération nom fichier
    set var=basename "C:\Users\e047\Desktop\test"
    for /r "C:\Users\e047\Desktop\test" %%i in (prelevement_imp.dat.*) do set VrTest=%%~nxi
    echo %VrTest%
    
    set test=%VrTest%
    :::Les trois derniers caractères
    echo %test:~-3%
    :::les trois premiers
    echo %test:~0,19%
    echo %test:~0,19%.%test:~-3%
    for /r "C:\Users\e047\Desktop\test" %%i in (*.*) do rename "%VrTest%" "%test:~0,19%.%test:~-3%"
    parcontre j'ai en retour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    C:\Users\e047\Desktop>totolalatoutou.bat
    prelevement_imp.dat.t.135.150
    150
    prelevement_imp.dat
    prelevement_imp.dat.150
    Le fichier spécifié est introuvable..
    hors j'ai bien qu'un seul fichier ne se nommant pas ainsi et bien présent.

  4. #4
    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
    Points : 3 768
    Points
    3 768
    Par défaut
    Tu peux tout faire dans la même boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @echo off
    
    ::récupération nom fichier
    set var=basename "C:\Users\e047\Desktop\test"
    for /r "C:\Users\e047\Desktop\test" %%i in (prelevement_imp.dat.*) do (set VrTest=%%~nxi
    echo %VrTest%
    set test=%VrTest%
    echo %test:~-3%
    echo %test:~0,19%
    echo %test:~0,19%.%test:~-3%
    ren "C:\Users\e047\Desktop\test\%VrTest%" "C:\Users\e047\Desktop\test\%test:~0,19%.%test:~-3%")
    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  5. #5
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par sachadee Voir le message
    Tu peux tout faire dans la même boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @echo off
    
    ::récupération nom fichier
    set var=basename "C:\Users\e047\Desktop\test"
    for /r "C:\Users\e047\Desktop\test" %%i in (prelevement_imp.dat.*) do (set VrTest=%%~nxi
    echo %VrTest%
    set test=%VrTest%
    echo %test:~-3%
    echo %test:~0,19%
    echo %test:~0,19%.%test:~-3%
    ren "C:\Users\e047\Desktop\test\%VrTest%" "C:\Users\e047\Desktop\test\%test:~0,19%.%test:~-3%")
    Oui je me doute, j'avais juste fait en détaillé pour voir ce que ca donne pas à pas (mieux vaut quand on fait peut de batch windows comme moi)

    Parcontre ta commande de rename n'est pas reconnu par windows erreur de syntaxe
    Etant déjà dans le dossier de travail je suis revenu à ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ::récupération nom fichier
    set var=basename "C:\Users\e047\Desktop\test"
    for /r "C:\Users\e047\Desktop\test" %%i in (prel*.*) do (set VrTest=%%~nxi
    echo %VrTest%
    ::3 derniers caractères
    echo %VrTest:~-3%
    ::19 premiers caractères
    echo %VrTest:~0,19%
    ::nom final
    echo %VrTest:~0,19%.%VrTest:~-3%
    ren %VrTest% %VrTest:~0,19%.%VrTest:~-3%)
    Pour ne pas m’embêter j'ai juste reprit une seule variable et retirer %test% qui me servait juste pour différencier la partie récupération nom et substitution, et j'ai le même soucis que plus haut: Le fichier spécifié est introuvable.pourtant quand je fais echo du ren j'ai un retour correcte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    C:\Users\e047\Desktop>totolalatoutou.bat
    prelevement_imp.dat.t.135.136.140
    140
    prelevement_imp.dat
    prelevement_imp.dat.140
    ren prelevement_imp.dat.t.135.136.140 prelevement_imp.dat.140
    Après différent test c'est comme si il ne detectait pas de fichier alors qu'il voie bien le nom

  6. #6
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Citation Envoyé par aerane Voir le message
    ren prelevement_imp.dat.t.135.136.140 prelevement_imp.dat.140
    salut,

    mais y'a un t là sur ton nom de fichier, c'est normal ?

  7. #7
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par minnesota Voir le message
    salut,

    mais y'a un t là sur ton nom de fichier, c'est normal ?
    Oui je l'avais mal nommer de base, mais étant donné que je garde que jusqu'au .dat et les 3 derniers caractères il n'y a aucune incidence, même en corrigeant ça j'ai encore le même message d'erreur sur mon retour de script comme stipuler ci dessus.

  8. #8
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Oui, mais si c'est le nom du fichier que tu es censé renommer, il ne peut être trouvé. Si tu fais directement un ren "nom" "nouveau_nom" sur ta console est-ce que tu rencontres le même message d'erreur ? Où nom est bien entendu le nom de ton fichier que tu vois dans l'explorateur et qui est donc supposé existé.

  9. #9
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 75
    Points
    75
    Par défaut
    En gros je te décortique ce que je veux faire par rapport au code


    Ici je récupère le nom du fichier présent (dans le cas final ce sera un fichier ici présent, et 3 répertoires)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set var=basename "C:\Users\e047\Desktop\test"
    Je précise le dossier d'action et la variable du nom de fichier, pour le fichier commencant par "prel"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for /r "C:\Users\e047\Desktop\test" %%i in (prel*.*) do (set VrTest=%%~nxi
    affichage de la récupération des 3 derniers caractères du nom du fichier: le quantième
    affichage de la récupération de la base du nom qui ne chante pas: prelevement_imp.dat
    affichage du nouveau nom à donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo %VrTest:~0,19%.%VrTest:~-3%
    définition de la variable du nouveau non (inutil mais je detail)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set newname=%VrTest:~0,19%.%VrTest:~-3%
    rename du fichier avec rename nom_ancien (variable définit au dessus avec le nom à rallonge) vers le nouveau nom (nom de base + quantième)

  10. #10
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    ça j'avais compris, mais t'a pas répondu à la question...
    si tu écris sur ta console ren "prelevement_imp.dat.135.136.140" "prelevement_imp.dat.140" est-ce que ça fonctionne ?

  11. #11
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 75
    Points
    75
    Par défaut
    Oui ça marche, (c'est même un des premiers truc que j'avais testé).

    Question bête, pourtant si je précise prel*.* même si après le .* il y a d'autre extension windows doit les prendre en compte, je ne suis pas obliger de préciser *.*.*... ça n'aurai aucun sens. C'est limite si je ne voie l'erreur que de ce côté pour ma par.

  12. #12
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    non, non, prel*.* est suffisant... dès que j'ai un instant, je regarde ton code de plus près.

  13. #13
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par minnesota Voir le message
    non, non, prel*.* est suffisant... dès que j'ai un instant, je regarde ton code de plus près.
    Ok merci

  14. #14
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Voilà une petite ébauche avec une autre approche, tu l'utilises simplement en faisant un call calendarRenFile "ton_fichier". Je sais pas comment on dit quantième en anglais de manière très condensé, j'ai lâché l'affaire après quelques longues minutes de recherches


    calendarRenFile.cmd

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    set "full_name=%~f1"
    set "file_name=%~nx1"
    set "file_date=%~x1"
    call :setbasename "%file_name:.dat.=" "%"
    if not exist "%~dp1%base_name%%file_date%" ren "%full_name%" "%base_name%%file_date%"
    echo %errorlevel%
    goto :eof
    
    :setbasename
    set "base_name=%~1.dat"
    goto :eof

  15. #15
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 75
    Points
    75
    Par défaut
    De cette manière ça part un peu loin par rapport a mon niveau

    parcontre un truc marrant, quand je re ouvre un invit DOS j'ai cela au premier lancement de script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    C:\Users\e047\Desktop>totolalatoutou.bat
    Commande ECHO désactivée.
    ~-3
    ~0,19
    ~0,19VrTest:~-3
    c:\temp\*
    Le fichier spécifié est introuvable.
            0 fichier(s) copié(s).
    Puis juste après ca semble ok
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    C:\Users\e047\Desktop>totolalatoutou.bat
    prelevement_imp.dat.130.154.147.154
    154
    prelevement_imp.dat
    prelevement_imp.dat.154
    Le fichier spécifié est introuvable.
    As tu le même résultat de ton côté si tu créer des fichiers +/- similaire en nom pour tester l'action ? Je n'ai pas d'autre poste sous la main pour voir ça...(mon win7 au boulot est plus que déglingué et pas moyen de refaire mon poste )

  16. #16
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Citation Envoyé par aerane Voir le message
    De cette manière ça part un peu loin par rapport a mon niveau
    Oui, mais c'est flexible y'a plus de notions de délimitation par longueur de chaine. Si tu veux rester sur ta première approche, ça ne me dérange pas. Je regarde...

    ah oui, mais ça peut pas marcher, il faut activer les extensions de variables étant donné que tu fais des affectations de variables dans la boucle, et il faut les lire avec ! au lien de %

  17. #17
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par minnesota Voir le message
    ah oui, mais ça peut pas marcher, il faut activer les extensions de variables étant donné que tu fais des affectations de variables dans la boucle, et il faut les lire avec ! au lien de %
    Donc il faut que je syntaxe ca de quelle manière, c'est bien la première fois que je tombe sur ce cas...

  18. #18
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    setlocal enabledelayedexpansion
    for /f %%i in ('dir /b *.dat.*') do (
      set VrTest=%%~i
      echo !VrTest!
      echo !VrTest:~-3!
      echo !VrTest:~0,19!
      echo ren "!VrTest!" "!VrTest:~0,19!.!VrTest:~-3!"
      ren "!VrTest!" "!VrTest:~0,19!.!VrTest:~-3!"
    )
    endlocal

  19. #19
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 75
    Points
    75
    Par défaut
    Merci ça marche du tonerre,

    Donc plus qu'à préciser mon chemin d'action et tout sera bon

    Merci beaucoup.

  20. #20
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Citation Envoyé par aerane Voir le message
    Donc plus qu'à préciser mon chemin d'action et tout sera bon
    Oui et il faut quand même que tu ajoutes un contrôle pour t'assurer que les 3 derniers caractères des 19 premiers correspondent à dat, parce y'a un risque non négligeable de ne plus s'y retrouver en cas d'erreurs... et tant qu'à faire une protection contre la récursivité et ne pas tenter de renommer un fichier qui l'a déjà été... et tant qu'à faire aussi un log...
    Enfin pense s'y quoi, surtout si les fichiers manipulés revêtent un caractère important

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 14h20
  2. Récupérer le nom du fichier spool correspondant à un job
    Par chtiot dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 23/02/2004, 21h28
  3. Réponses: 2
    Dernier message: 29/01/2004, 12h05
  4. Réponses: 4
    Dernier message: 10/10/2003, 19h04
  5. nom de fichier et variables d'environnement
    Par joebarthib dans le forum Langage
    Réponses: 2
    Dernier message: 18/07/2002, 16h21

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