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 :

Extraire dossier d'un chemin de fichier [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 30
    Par défaut Extraire dossier d'un chemin de fichier
    Bonjour,

    Etant un total débutant en batch, je galère grave sur un truc à priori tout simple !

    Mon besoin : j'ai un fichier .txt qui liste l'ensemble des fichiers que je dois copier d'un répertoire vers un autre.
    Le contenu de ce fichier est du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /data/disque/100/100111/tata.txt
    /data/disque/800/800123/toto.txt
    Je dois faire un script en .bat qui parcours ce fichier, et copie les fichiers situés dans "dossier1" dans "dossier2".

    Les dossiers "dossier1", "dossier2" ainsi que le script .bat en question sont situés dans le même dossier.


    Je parcours donc ce fichier, manipule la ligne pour enlever "/data/" car elle m'est inutile.
    L'arborescence dans dossier1 est la suivante : /dossier1/disque (c'est pour cela que j'ai enlevé le /data/).

    Mon problème est le suivant : pour l'instant dans dossier2, c'est totalement vide, du coup pour la copie j'utilise XCOPY afin que ça me créé aussi les sous dossiers car je veux la même arborescence.
    Le problème c'est que quand je fais xcopy "%source%" "%cible%" /E /F /Y , ça me pose la question
    Est-ce que D:\test\dossier2\disque\100\100111\tata.txt désigne un nom de fichier
    ou un nom de répertoire de la destination
    (F = fichier, R = répertoire)*?
    Du coup, en fait il faudrait que dans la commande XCOPY dans la variable cible, je ne passe que le nom du répertoire sans le nom de fichier, mais je n'arrive pas à le récupérer ! Je voudrais que CIBLE = /dossier2/disque/100/100111/

    Je n'arrive pas à comprendre comment arriver à dégager le fichu nom du fichier !
    Ci dessous, mon code qui ne fonctionne donc pas exactement comme je veux !

    Quelqu'un aurait-il une idée de comment je dois faire ? C'est peut etre pas la meilleure façon de faire, si une solution plus facile existe faite signe.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    REM Script de copie des fichiers à partir d'une liste
    @echo off
    
    echo Debut de la copie
    
    set nomFichierList=%1
    set repertoireSource=%2
    set repertoireCible=%3
    
    rem Parcours de la liste des fichiers
    echo Debut deplacement fichier
    FOR /f %%i IN (%nomFichierList%) DO (
      call :moveFile %%i
    )
    echo Fin deplacement fichier
    
    goto END
    
    rem ############################################################
    rem ###                Fonctions utilisees                  ####
    rem ############################################################
    
    rem #### Debut move File
    :moveFile
    set fichier=%1
    set fichierCourt=%fichier:/data/=%
    set source=%repertoireSource%/%fichierCourt%
    set cible=%repertoireCible%/%fichierCourt%
    echo Cible avant %cible%
    
    rem il faudrait enlever le nom du fichier de la variable cible
    
    xcopy "%source%" "%cible%"  /E /F /Y
    
    GOTO :eof
    rem #### Fin moveFile
    
    :END
    pause
    exit

  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,

    Tu veux copier tout le contenu du dossier1 vers dossier2 ? C'est ça ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 30
    Par défaut
    Non juste certains fichiers qui sont listés dans le fichier .txt

  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
    Avec for et les tokens tu peux arriver à tes fins.
    Après comme tu mets move dans ta source, on ne sait plus trop si tu veux copier ou déplacer (commande move /ou copy + del). Voici une petite ébauche à compléter ou affiner.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for /f "tokens=1,* delims=/" %%i in (listedefichiers.txt) do call :makecopy "%%~j"
    goto :eof
    
    :makecopy
    set "arg1=%~1"
    set relativepath=%arg1:/=\%
    echo %relativepath%
    echo f|xcopy /y ".\dossier1\%relativepath%" ".\dossier2\%relativepath%"
    goto :eof

  5. #5
    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
    Salut,

    Voici un exemple pour extraire un non de fichier avec extension:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @echo off
    
    call:extract var "\dossier\fichier.extension"
    echo %var%
    pause
    exit /b
    
    :extract VARIABLE CHEMIN_DU_FICHIER
    set %~1=%~nx2
    goto:eof

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 30
    Par défaut
    Bonjour,

    Merci à vous deux !

    Bon j'ai fait d'une autre manière au final en m'inspirant de vos réponses et de quelques infos trouvées sur le web.
    Ci dessous le code de la fonction utilisée pour récupérer uniquement le dossier :
    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
    rem #### get dirname
    :dirname VARIABLE CHEMIN_DU_FICHIER
    set DirPath=%2
    set dirAAjouter=
    set dirname=
    
    :boucle
      rem Si DirPath est vide, alors cela signifie que le traitement est fini, on sort de la boucle
      if "%DirPath%" == "" goto :done
      rem si dirAAjouter n'est pas vide, alors on ajoute son info à dirname pour construire le chemin
      if not "%dirAAjouter%" == "" set dirname=%dirname%%dirAAjouter%\
      rem on découpe la chaine restant en fonction des \
      For /F "tokens=1* delims=\" %%a in ("%DirPath%") Do (
    	  rem la premier élement est le dossier à ajouter au chemin en construction
    	  set dirAAjouter=%%a
    	  rem le reste de la chaine est ce qui reste encore à traiter
    	  Set DirPath=%%b
      )
      goto :boucle
    :done
    rem on assigne la valeur à la variable passée en paramètre
    set %~1=%dirname%
    goto:eof

    La, mon code complet qui pourra peut etre aider quelqu'un
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    rem ############################################################
    rem ###               Script de copie de fichiers           ####
    rem ###     à partir d'une fichier listant les fichiers     ####
    rem ############################################################
    REM
    @echo off & setlocal enabledelayedexpansion enableextensions
    cls
    
    set nomFichierLog=log_copieFichier.log
    
    echo Lancement du script de copie des fichiers >%nomFichierLog%
    
    set nomFichierList=%1
    set repertoireSource=%2
    set repertoireCible=%3
    
    if not defined nomFichierList (
    	echo Lancer le script en passant les parametres : nomFichierLists repertoireSource repertoireCible >>%nomFichierLog%
            echo Parametre passee : %1 ; %2 ; %3  >>%nomFichierLog%
    	goto end
    )else if not defined repertoireSource (
    	echo Lancer le script en passant les parametres : nomFichierLists repertoireSource repertoireCible >>%nomFichierLog%
    	echo Parametre passee : %1 ; %2 ; %3  >>%nomFichierLog%
    	goto end
    )else if not defined repertoireCible (
    	echo Lancer le script en passant les parametres : nomFichierLists repertoireSource repertoireCible >>%nomFichierLog%
    	echo Parametre passee : %1 ; %2 ; %3  >>%nomFichierLog%
    	goto end
    )
    
    
    (
    echo Nom du fichier : %nomFichierList%
    echo Repertoire source : %repertoireSource%
    echo Repertoire cible : %repertoireCible%
    )>>%nomFichierLog%
    
    rem Test si les variables rentrées existent
    if not exist %nomFichierList% (
    	echo Le fichier %nomFichierList% n'existe pas >>%nomFichierLog%
    	goto  end
    )
    if not exist %repertoireSource% (
    	echo Le repertoire %repertoireSource% n'existe pas >>%nomFichierLog%
    	goto  end
    )
    if not exist %repertoireCible% (
    	echo Le repertoire %repertoireCible% n'existe pas >>%nomFichierLog%
    	goto  end
    )
    
    rem Parcours de la liste des fichiers
    echo #### Debut deplacement fichier >>%nomFichierLog%
    FOR /f %%i IN (%nomFichierList%) DO (
      call :copierFile %%i
    )
    echo #### Fin deplacement fichier >>%nomFichierLog%
    
    :end
    pause & endlocal & goto:eof
    
    rem ############################################################
    rem ###                Fonctions utilisees                  ####
    rem ############################################################
    rem #### Debut copierFile
    :copierFile
    set fichier=%1
    set fichier=%fichier:/=\%
    set fichierCourt=%fichier:\data\=%
    
    set source=%repertoireSource%\%fichierCourt%
    set cible=%repertoireCible%\%fichierCourt%
    
    call:dirname dossierDestination %cible%
    
    xcopy "%source%" "%dossierDestination%" /S /E /F /Y >>%nomFichierLog%
    
    GOTO :eof
    rem #### Fin copierFile
    
    
    rem #### get dirname
    :dirname VARIABLE CHEMIN_DU_FICHIER
    set DirPath=%2
    set dirAAjouter=
    set dirname=
    
    :boucle
      rem Si DirPath est vide, alors cela signifie que le traitement est fini, on sort de la boucle
      if "%DirPath%" == "" goto :done
      rem si dirAAjouter n'est pas vide, alors on ajoute son info à dirname pour construire le chemin
      if not "%dirAAjouter%" == "" set dirname=%dirname%%dirAAjouter%\
      rem on découpe la chaine restant en fonction des \
      For /F "tokens=1* delims=\" %%a in ("%DirPath%") Do (
    	  rem la premier élement est le dossier à ajouter au chemin en construction
    	  set dirAAjouter=%%a
    	  rem le reste de la chaine est ce qui reste encore à traiter
    	  Set DirPath=%%b
      )
      goto :boucle
    :done
    rem on assigne la valeur à la variable passée en paramètre
    set %~1=%dirname%
    goto:eof

  7. #7
    Expert confirmé
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 843
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 843
    Par défaut
    et pour le partage de votre source mais n'oubliez pas surtout de mettre cette discussion en
    Bonne Continuation

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/04/2010, 16h47
  2. Réponses: 2
    Dernier message: 04/04/2010, 23h38
  3. [Batch] Extraire nom dernier dossier d'un chemin
    Par terrance dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 28/12/2009, 09h45
  4. Réponses: 1
    Dernier message: 01/04/2009, 08h02
  5. Chemin des fichiers et dossier
    Par kazylax dans le forum VB.NET
    Réponses: 5
    Dernier message: 11/03/2008, 22h21

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