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 :

Lister les fichiers dans en un dossier et dossier enfant avec arborescence [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Points : 53
    Points
    53
    Par défaut Lister les fichiers dans en un dossier et dossier enfant avec arborescence
    Bonjour à tous

    Je cherche un moyen de lister tous les fichiers dans un dossier et toute son arborescence comme le fait tree. Mais il me faut l'arborescence de chaque fichier sur toute les lignes. Et y si possible le chemin à partir du dossier et non de la racine.

    J'ai également regardé du coté de dir, mais rien de concluant.

    Voilà ce que j'ai avec tree :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    +---maps
    |       l4d_lambda_01.bsp
    |       l4d_lambda_01.nav
    |       l4d_lambda_01_level_sounds.txt
    |       l4d_lambda_02.bsp
    +---materials
    |   +---Brick
    |   |       brickfloor001a.vmt
    |   |       brickfloor001a.vtf
    |   |       brickwall001a.vmt
    Et voilà ce que je voudrais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    maps/l4d_lambda_01.bsp
    maps/l4d_lambda_01.nav
    maps/l4d_lambda_01_level_sounds.txt
    maps/l4d_lambda_02.bsp
    maps/l4d_lambda_02.nav
    materials/Brick/brickfloor001a.vmt
    materials/Brick/brickfloor001a.vtf
    materials/Brick/brickwall001a.vmt
    materials/Brick/brickwall001a.vtf

    Le but est d générer une fichier qui sera utilisé par la suite.

    Je souhaiterais faire ça de façon automatique pour pouvoir répéter l'opération pour plusieurs dossier, mais si je ne peut pas c'est pas grave, il faut au moins que j'y arrive manuellement. C'est à dir que s'il faut éditer le fichier texte généré par la suite je m'en contenterais.


    Merci d'avance pour votre aide.

    Note : il y a plus de 22 000 fichiers et 250 dossiers.

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    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
    setlocal enableextensions enabledelayedexpansion
    
    REM Définition du chemin d'appel.
    set root=%~dp0
    REM Parcours de tous les fichiers de l'arborescence courante.
    for /f "usebackq" %%I in (`dir /a /b /-p /s`) do (
    	call :rmvpath "%root%" "%%I"
    )
    goto :eof
    
    :rmvpath
    REM %1 = path à supprimer, %2 = fichier complet.
    REM Suppression des guillemets
    set todel=%~1
    set toprint=%~2
    REM Parcourt simultané des deux chaînes et suppression
    for /L %%A in (0,1,256) do (
    	REM Plus de PATH => on affiche et on revient à l'appelant.
    	if "!todel!"=="" (
    		echo !toprint!
    		goto :eof
    	)
    	REM Sinon, suppression du premier caractère.
    	set todel=!todel:~1!
    	set toprint=!toprint:~1!
    )
    A appeler depuis le répertoire à analyser, la sortie du batch est redirigeable vers un fichier quelconque si besoin.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Points : 53
    Points
    53
    Par défaut
    Merci pour ton aide.

    Je me sent un peu bête de pas avoir trouvé la commande avec dir, à vrai dire je me suis induit en erreur avec le paramètre /b je pensais que je n'aurais que le nom du fichier.

    Pour le reste, la suppression du chemin d'accès j'avoue ne pas comprendre. Je ne parviens pas non plus à utiliser ce code, rien n'est affiché après les echo (Commande ECHO activée.).

    Au début le chemin d'appel est défini dans root, mais pourquoi ? Le path à supprimé n'est pas celui où se trouve le batch mais le dossier à lister.

    Plus loin est défini toprint avec %2, mais il n'y a que "C:\Documents" dedans (je devrais avoir H:\...). C'est dès le départ, dans %%I c'est la même chose. J'ai donc remplacé par :Cette fois je suis sur le bon disque mais pareil, au 1er espace la chaine est coupé.

    Le batch freeze un moment en utilisant 100% d'un core, même en testant que sur un dossier avec qu'un seul fichier dedans. Et je constat que for fait plus de 300 boucles, pour à peine un fichier à lister.
    C'est parce que (`dir /a /b /-p /s`) semble lister tous le C: en ajoutant %1 ca règle ce problème. D'ailleurs je ne travail pas sur C: ca ne pouvais donc pas fonctionner.

    Il y a deux goto :eof, où/qu'est :eof ?

    Pour faire mes tests je fais un glisser/déposer du dossier à lister sur le batch.

    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
    @echo off
    setlocal enableextensions enabledelayedexpansion
    
    REM Définition du chemin d'appel.
    set root=%~1
    
    REM Parcours de tous les fichiers de l'arborescence courante.
    for /f "usebackq" %%I in (`dir "%root%" /a /b /-p /s`) do (
    	call :rmvpath "%root%" "%%I"
    )
    pause
    goto :eof
    
    :rmvpath
    REM %1 = path à supprimer, %2 = fichier complet.
    REM Suppression des guillemets
    set todel=%~1
    set toprint=%~2
    REM Parcourt simultané des deux chaînes et suppression
    for /L %%A in (0,1,256) do (
    	REM Plus de PATH => on affiche et on revient à l'appelant.
    	if "!todel!"=="" (
    		echo !toprint!
    		goto :eof
    	)
    	REM Sinon, suppression du premier caractère.
    	set todel=!todel:~1!
    	set toprint=!toprint:~1!
    )

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Sparktacus Voir le message
    Pour le reste, la suppression du chemin d'accès j'avoue ne pas comprendre. Je ne parviens pas non plus à utiliser ce code, rien n'est affiché après les echo (Commande ECHO activée.).
    Je l'ai testé dans le répertoire courant, effectivement, là où est le batch lui-même.

    Il faut donc modifier la première partie ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @echo off
    setlocal enableextensions enabledelayedexpansion
    
    pushd %1
    REM Définition du chemin d'analyse.
    set root=%~dp1
    REM Parcours de tous les fichiers de l'arborescence courante.
    for /f "tokens=* usebackq" %%I in (`dir /a /b /-p /s`) do (
    	call :rmvpath "%root%" "%%I"
    )
    popd
    goto :eof
    J'ai rajouté aussi, donc, la prise en compte de l'intégralité du token lu.

    Citation Envoyé par Sparktacus Voir le message
    Le batch freeze un moment en utilisant 100% d'un core, même en testant que sur un dossier avec qu'un seul fichier dedans. Et je constat que for fait plus de 300 boucles, pour à peine un fichier à lister.
    Avec la modif ci-dessus, ça ne devrait plus arriver. Pour le fait que ça n'utilise qu'un seul core, c'est normal : les batchs ne sont pas threadés, et hors commandes, ils bouffent tout ce qui est disponible le plus souvent.

    Citation Envoyé par Sparktacus Voir le message
    Il y a deux goto :eof, où/qu'est :eof ?
    Cours sur les batchs, c'est une étiquette définie par défaut signifiant "fin du batch". On s'en sert pour arrêter le traitement d'une sous-fonction, ou le batch lui-même.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Points : 53
    Points
    53
    Par défaut
    End Of File, j'aurrais du le reconnaitre

    Ca fonctionne très bien, merci beacoup.

    Est-ce que tu penses qu'on peut s'arranger pour que les répertoire ne soit pas lister ? Qu'il y ai le chemin d'accès des fichiers uniquement ?

    Ca n'empêche pas le fonctionnement, les erreurs sont ignorés, mais ca ralentis beacoup.

    Il y a aussi au bout des ligne un espace

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Sparktacus Voir le message
    Est-ce que tu penses qu'on peut s'arranger pour que les répertoire ne soit pas lister ? Qu'il y ai le chemin d'accès des fichiers uniquement ?
    Très facile, il suffit de modifier la boucle principale ainsi (ajout en rouge) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for /f "tokens=* usebackq" %%I in (`dir /a /b /-p /s`) do (
    	REM Uniquement les fichiers, pas les répertoires.
    	if not exist "%%I\" call :rmvpath "%root%" "%%I"
    )
    Petite explication : considérant %%I comme un nom de fichier OU de répertoire, on concatène "\" à la fin. Si c'est un répertoire, on accède à son contenu (le pseudo-répertoire ".", donc), qui forcément existe. Si c'est un fichier, par contre, il n'y a bien sûr pas de possibilité d'accéder à ce "." qui n'existe pas.
    Il ne peut pas y avoir de conflit de noms, car il n'est pas possible d'avoir dans le même répertoire un sous-répertoire et un fichier possédant le même nom, et le caractère "\" est interdit dans les noms de fichiers normaux.

    Citation Envoyé par Sparktacus Voir le message
    Il y a aussi au bout des ligne un espace
    Je n'ai aucun espace pour ma part. Vérifie que tu n'as pas rajouté un espace à la fin du echo !toprint! en recopiant le batch depuis le forum : le deuxième ! doit être le dernier caractère de la ligne (et on voit là l'utilité d'un bon éditeur de texte qui supprime les caractères blancs en fin de ligne automatiquement... ).
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Points : 53
    Points
    53
    Par défaut
    Très malin

    Merci beacoup Mac LAK

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Points : 53
    Points
    53
    Par défaut
    A zut il y a une chose que je n'avais pas remarqué. Quand la liste est créé il ne faut pas que le dossier parent soit dans arborescence. Je fais un glissé déposé de "mondossier", toute l'arboressance enfant doit être listé sans "mondossier/"


    note : le nom du dossier je l'ai déjà dans %nom_du_fichier%

  9. #9
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Sparktacus Voir le message
    A zut il y a une chose que je n'avais pas remarqué. Quand la liste est créé il ne faut pas que le dossier parent soit dans arborescence. Je fais un glissé déposé de "mondossier", toute l'arboressance enfant doit être listé sans "mondossier/"
    Cela dépend simplement du fait que tu ajoutes (ou pas ! ) un "\" terminal au nom du répertoire passé en paramètre.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    C:\>FlatTree.bat "C:\Program Files\Windows Media Player"
    Windows Media Player\wmpns.dll
    Windows Media Player\wmpnscfg.exe
    Windows Media Player\wmpnssci.dll
    Windows Media Player\wmpshare.exe
    Windows Media Player\wmsetsdk.exe
    Windows Media Player\Network Sharing\connectionmanager.xml
    Windows Media Player\Network Sharing\contentdirectory.xml
    Windows Media Player\Network Sharing\mediareceiverregistrar.xml
    Windows Media Player\Network Sharing\wmpnss_bw120.jpg
    Windows Media Player\Network Sharing\wmpnss_bw120.png
    Windows Media Player\Network Sharing\wmpnss_bw32.bmp
    Windows Media Player\Network Sharing\wmpnss_bw32.jpg
    Windows Media Player\Network Sharing\wmpnss_bw48.bmp
    Windows Media Player\Network Sharing\wmpnss_bw48.jpg
    
    C:\>FlatTree.bat "C:\Program Files\Windows Media Player\"
    wmpns.dll
    wmpnscfg.exe
    wmpnssci.dll
    wmpshare.exe
    wmsetsdk.exe
    Network Sharing\connectionmanager.xml
    Network Sharing\contentdirectory.xml
    Network Sharing\mediareceiverregistrar.xml
    Network Sharing\wmpnss_bw120.jpg
    Network Sharing\wmpnss_bw120.png
    Network Sharing\wmpnss_bw32.bmp
    Network Sharing\wmpnss_bw32.jpg
    Network Sharing\wmpnss_bw48.bmp
    Network Sharing\wmpnss_bw48.jpg
    Network Sharing\wmpnss_bw48.png
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

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

Discussions similaires

  1. lister les fichiers dans dossier et sous dossier
    Par chuspyto dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 12/04/2015, 18h47
  2. [XL-2003] Lister les fichiers dans les dossiers et sous dossiers
    Par doncamelo dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 14/07/2010, 10h41
  3. Comment lister les fichiers dans un répertoire ?
    Par PatricePatrice dans le forum Framework .NET
    Réponses: 18
    Dernier message: 04/01/2007, 10h15
  4. [FTP] Lister les fichiers dans un repertoire
    Par Death83 dans le forum Langage
    Réponses: 3
    Dernier message: 16/11/2006, 15h31

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