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 :

Renommer et déplacer à la volée des PDF [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 432
    Par défaut Renommer et déplacer à la volée des PDF
    Bonjour,

    je suis débutant en script Batch, et je sollicite votre aide.

    Donc dans la société nous avons un scanner qui scanne a la volé dans un dossier partagé, cependant j'ai deux option "Multi" ou "simple".

    Le "Multi" créer un PDF par paquet, met toute les pages dans le PDF, bien sur chaque PDF est nommé aléatoirement.

    Sinon le mode simple me créer un seul PDF par fichier, seulement il me créer par paquet un dossier nommé aléatoirement et me met tout les fichier du paquet, en les nommant "fichier1" "fichier2" "fichier3" .....

    et donc mon besoin est d'avoir tout mes scanner avec un nom différent dans un seul fichier. Evidemment si je fait un simple move du fichier il va y avoir plein de doublon qui serons écrasé et je ne peux pas me permettre d'en perdre un seul.

    Vous allez me dire configure ton scanner.... déjà fait je ne peux pas faire mieux la société de maintenant a déjà envoyé une poignée de technicien et rien n'y fais. bref nous ne somme pas la pour parler de mon scanner.

    Donc je désire faire me mettre dans un dossier et parcourir tout les dossier enfant, renommer déplacer tout les PDF dans le dossier parent en les renommant aléatoirement, puis si le dossier est vide le supprimer.

    Donc je voulais faire un savant mélange avec la fonction move et une variable date qui donnerai dans le nom les secondes, mais le script est trop rapide donc il va y avoir des doublons.

    j'ai donc trouvé ce script qui renomme a la volé de maniere plus ou moins aléatoires tout les pdf d'un dossier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    set i=0 
    for /f "delims=" %%a in ('dir "*.pdf" /b') do call :commande "%%a" 
    set i= 
    ::
    :commande 
    set valeur=%1 
    set /a i=%i%+1 
    ren %valeur% newbl%i%.pdf
    Dans un premier temps je désire comprendre un peu mieux ce code par exemple je ne comprend pas "/f" ou "%%a" je sais que "%qqc" est une variable au même titre qu'en php "$qqc".

    Ensuite j'aimerai faire une récursivité c'est a dire ne plus renommé a la volé les fichier ou le script se trouve mais donner un chemin de dossier parent et effectuer le renommage que dans les dossier enfants.

    Puis déplacer tout les PDF renommer dans le dossier parent (je pense que déplacer et renommer en même temps est plus intelligent et plus pratique non ?).

    et enfin supprimer les dossier enfants vide.


    Je vous remercie par avance de l'aide que vous pouvez m'apporter.

    Bonne soirée

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 432
    Par défaut
    Bonjour,
    je vois qu'il n'y a pas foule pour répondre j'en suis bien atristé.

    Cependant j'avance mais je rencontre toujorus quelque difficulté que je ne comprend pas
    Actuellement mon code est celui la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    set i=0 
    for /f "delims=" %%a in ('dir /s "C:\DangerTestEnCour\Parents\*.pdf" /b') do call :commande "%%a" 
    set i= 
    ::
    :commande 
    set valeur=%1 
    set /a i=%i%+1 
    
    move %valeur% "C:\DangerTestEnCour\Parents\newbl%i%.pdf"
    En gros le script est censé être a la racine mais pour des soucis de sécurité j'ai descendu d'un dossier. Bref le programme parcours tout les sous dossier du dossier parent, et déplace et renomme tout les PDF.
    Comme vous pouvez le voir une variable incrémenté donne un nom différent a chaque fichier. Et me déplace les PDF dans le dossier parent.

    J'ai fait un test sur 20 PDF dans 2 sous dossier enfant différent, et je me retrouve la vous allez rire, avec 19 PDF dans le dossier parent...
    Le 20eme est a coté de mon script a la racine fictive "DangerTestEnCour"

    C'est une chose que je ne comprend pas, Pourquoi ? pouvez vous m'aider ?
    merci d'avance pour vos lumières

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 69
    Par défaut
    Salut,
    te manque pas un : goto :eof, à la fin de ta fonction ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 432
    Par défaut
    Bonjour,

    C'est une tres bonne question, je sais que j'ai un souci de fin de boucle mais je ne sais pas comme délimiter das le code se qui appartient la boucle ou non

    Par exepmle dans mon code qui fonctionne a peu pret
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    set i=
    set /P i= < C:\DangerTestEnCour\compteur.txt
    
    for /f "delims=" %%a in ('dir /s "C:\DangerTestEnCour\Parents\*.pdf" /b') do call :commande "%%a" 
    
    ::
    :commande 
    set valeur=%1 
    set /a i=%i%+1 
    
    move %valeur% "C:\DangerTestEnCour\Parents\newbl%i%.pdf"
    
    del "C:\DangerTestEnCour\compteur.txt"
    echo %i% > "C:\DangerTestEnCour\compteur.txt"
    j'aimerai détruire et créer qu'une seul fois mon fichier compteur.txt
    cependant il le fait a chaque boucle, de plus il ne renomme pas que les fichier dans les dossiers. une fois, les fichier déplacé et renommer, il s'attaque au fichier qui étais dans les dossiers en gros il les renommes deux fois.

    Bon cela fonctionne je pourrai fermer le post mais peut être auriez vous des idée pour régler les petits défauts.

  5. #5
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Déjà tu utilises un move alors que tu ne fais que renommer des fichiers, et comme en plus, tu utilises le même dossier, forcément, les fichiers déjà traités le seront de nouveau à chaque exécution de ton script. Si tu souhaites conserver tes fichiers dans le dossier "parents" et pour éviter ce "renommage" cyclique, tu peux par exemple filtrer la sortie de dir avec findstr, ce qui donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for /f "tokens=*" %%a in ('dir /s /b /a-d "c:\dangertestencour\parents\*.pdf" ^| findstr /ivr "\\newbl[0-9]*\.pdf"') do call :commande "%%a"

    et puis tant qu'à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    set i=
    set /p i=<C:\DangerTestEnCour\compteur.txt
    for /f "tokens=*" %%a in ('dir /s /b /a-d "c:\dangertestencour\parents\*.pdf" ^| findstr /ivr "\\newbl[0-9]*\.pdf"') do call :commande "%%a"
    (echo %i%)>C:\DangerTestEnCour\compteur.txt
    goto :eof
    
    :commande
    set /a i+=1
    ren "%~1" "newbl%i%.pdf"
    goto :eof
    après bien sûr, il convient de faire en sorte que le script puisse être en mesure de gérer toutes les situations possibles, et puis aussi tu peux te passer de compteur.txt en faisant un simple comptage, et cetera.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 432
    Par défaut
    Bonjour minnesota,

    Un grand merci c'est exactement cela que je voulais. Néanmoins j'ai remit ma commande move car j'ai besoin de déplacer les PDF qui sont trouver des dossiers enfant dans parents et les déplacer justement hors des enfants mais toujours dans parent.

    Bref cela fonctionne.
    Je suis toute fois curieux de l'idée de se passer de compteur.txt qu'avez vous en tête ? Il faut savoir que des nouveau PDF arrive toute la journée se qui fait que ce script exécuter mettons toutes les heures risque fort de se retrouver avec les PDF renommé l'heure d'avant, qui n'ont pas encore été traiter (oui il y a un autre traitement avec intervention humaine).

    D'ou mon idée de compteur afin de ne pas perdre le fils du décompte et ainsi éviter d'utiliser deux fois le même numéro.

    je me permet toutefois de revenir sur le code car j'ai un peu de mal a saisir les étape de certaine chose, par exemple se qui me dérange le plus c'est la boucle si on compare avec de l'algorithmie, on ouvre notre boucle avec Tant que, puis on la ferme avec Fin Tant que. Tout se qui est dedans appartiens a la boucle au delà c'est autre chose.

    La j'ai un peu de mal a cerner son comportement avec les deux goto puis le commande, pouvez vous m'éclairer svp?

  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
    Citation Envoyé par darkterreur Voir le message
    pouvez vous m'éclairer svp?
    Voilà :



    Plus sérieusement, pour tes besoins d'informations d'ordre général sur les scripts cmd, il faut lire les tutos présents sur le site, ils sont là pour ça... cf épinglés de la section...

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 432
    Par défaut
    Bonjour minnesota,

    Je vous remercie de cette charmante attention

    Malheureusement si toutes les documentations étaient tres claire, je n'aurai pas le besoin de vous demander de l'aide, ou des précisions.

    Malgré la documentation, je ne comprend pas vraiment ceci:
    goto :eof

    :commande
    je vous remercie par avance.

  9. #9
    Membre éprouvé

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Par défaut
    Bonjour,

    l'aide de la commande goto 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
    Dirige cmd.exe sur une ligne étiquetée dans le programme de commandes.
    
    GOTO nom
    
      nom   Chaîne utilisée en tant que nom dans le programme de commandes.
    
    Les noms sont seuls sur une ligne et commencent par le signe ':'
    
    Si les extensions de commandes sont activées, GOTO est modifié comme suit :
    
    La commande GOTO accepte maintenant l'étiquette cible :EOF, qui transfère le
    contrôle à la fin du fichier de commande en cours. C'est un moyen pratique de
    sortir d'un fichier de commande sans y définir de nom de sortie. Entrer
    CALL /? pour avoir une description des extensions de la commande CALL qui
    rendent cette fonctionnalité utile.
    sinon un exemple:

    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
    @echo off
    goto etiquette_1
    :fin_etiquette_1
    call:etiquette_2
    echo fin du script
    pause
    exit /b
    
    :etiquette_1
    echo ici c'est l'etiquette_1
    pause
    goto fin_etiquette_1
    
    :etiquette_2
    echo ici c'est l'etiquette_2
    pause
    goto:eof

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 432
    Par défaut
    Bonjour, merci pour votre réponse
    donc si je comprend bien dans le cas du code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    set i=
    set /p i=<C:\DangerTestEnCour\compteur.txt
    for /f "tokens=*" %%a in ('dir /s /b /a-d "c:\dangertestencour\parents\*.pdf" ^| findstr /ivr "\\newbl[0-9]*\.pdf"') do call :commande "%%a"
    (echo %i%)>C:\DangerTestEnCour\compteur.txt
    goto :eof
    
    :commande
    set /a i+=1
    ren "%~1" "newbl%i%.pdf"
    goto :eof
    de la boucle for envoi l’exécution de la boucle plus bas a :commande
    Mais une fois le premier tour fait il y a
    qui renvoi ou ? au goto :eof qui est juste derrière le Echo? ou il termine sa boucle avant d'y retourné ?

    Et donc a qu'est ce qui fait qu'il remonte exécuter le Echo ensuite?

    Désolé si j'ai un peu de mal a comprendre

  11. #11
    Membre éprouvé

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    REM debut de la boucle for
    for /f "tokens=*" %%a in ('commande') do call:etiquette "parametre"
    REM fin de la boucle for
    REM création du fichier "compteur.txt" avec la variable "i" comme contenu
    (echo %i%)>C:\DangerTestEnCour\compteur.txt
    REM ici la commande goto:eof termine le script en cours car il n'est pas dans une étiquette.
    goto :eof
    après si tu souhaite juste effectuer un déplacement de fichiers d'un dossier vers un autre en les renommant avec une incrémentation tu peux essayer 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
    @echo off
    set dossier_src=\\dossier reseau source
    set dossier_dst=c:\dossier local de destination
    set filtre=*.pdf
    
    setlocal enabledelayedexpansion
    if not exist "%dossier_src%" echo ERREUR, "%dossier_src%" n'existe pas&pause&exit /b 1
    if not exist "%dossier_dst%" md "%dossier_dst%"
    if not exist "%dossier_dst%" echo ERREUR, la variable dossier_dst n'est pas un chemin de dossier valide&pause&exit /b 1
    set i=1&set i2=0&set i4=0
    for /r "%dossier_src%" %%i in (%filtre%) do (
    call:move "%%~fi" "%%~ni" "%%~xi" "%%~dpi"
    call:affichage
    )
    pause&exit /b 0
    
    :move
    if exist "%dossier_dst%\!i!%~3" set /a i+=1&goto move
    move %1 "%dossier_dst%\!i!%~3" >nul
    if errorlevel 0 (set /a i2+=1) else set /a i4+=1
    goto:eof
    
    :affichage
    cls
    echo !i2! deplacements [!i4! erreurs]
    goto:eof

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 69
    Par défaut
    Citation Envoyé par darkterreur Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    goto :eof
    
    :commande
    set /a i+=1
    ren "%~1" "newbl%i%.pdf"
    goto :eof
    Le premier goto :eof renvoit à la fin du fichier pour ne pas retraiter la fonction déclarée via le label :commande.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 432
    Par défaut
    Bien bien je comprend mieux

    Je vous remercie tous pour votre aide

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

Discussions similaires

  1. [XL-2007] Macro pour renommer et déplacer un pdf
    Par gemxtrust dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/12/2009, 12h40
  2. [FPDF] renommer des PDF par lot selon leurs contenus
    Par Gabor3D dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 06/01/2008, 12h55
  3. renommer des PDF
    Par frederic.go dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 12/07/2006, 13h34
  4. Liens pour apprendre à créer des PDF
    Par pmboutteau dans le forum Autres langages
    Réponses: 6
    Dernier message: 20/09/2005, 18h16
  5. [FPDF] Rechercher dans des pdf
    Par snike dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 09/09/2005, 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