Ajout dossier dans arborescence avec une variable

Résolu
yaphilde Messages postés 35 Statut Membre -  
barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour je souhaite, en batch, rajouter dans une arborescence de dossier existante un dossier pour chaque usager (j'en ai plus de deux cents).
Je m'explique voici la stucture de mon arborescence:

A:\Production\Usagers\Brad Pitt\AAA
A:\Production\Usagers\Brad Pitt\BBB
A:\Production\Usagers\Brad Pitt\CCC

A:\Production\Usagers\Angélina Jolie\AAA
A:\Production\Usagers\Angélina Jolie\BBB
A:\Production\Usagers\Angélina Jolie\CCC

A:\Production\Usagers\Sharlize Taron\AAA
A:\Production\Usagers\Sharlize Taron\BBB
A:\Production\Usagers\Sharlize Taron\CCC

Je souhaiterai pour chaque usager rajouter un dossier nommé "Mon nouveau dossier" à l'intèrieur du dossier "BBB". Ce qui me donnerai l'arborescence suivante:

A:\Production\Usagers\Brad Pitt\AAA
A:\Production\Usagers\Brad Pitt\BBB\Mon nouveau dossier
A:\Production\Usagers\Brad Pitt\CCC

A:\Production\Usagers\Angélina Jolie\AAA
A:\Production\Usagers\Angélina Jolie\BBB\Mon nouveau dossier
A:\Production\Usagers\Angélina Jolie\CCC

A:\Production\Usagers\Sharlize Taron\AAA
A:\Production\Usagers\Sharlize Taron\BBB\Mon nouveau dossier
A:\Production\Usagers\Sharlize Taron\CCC

Dans les élements à prendre en compte dans la conception du batch il faut souligner
que l'on peut retrouver des chemins avec des espaces et on peut retrouver
également des chemins avec des accents.

Le batch, je pense devrait débuter de cette facon;

@echo off
set DossierDesUsagers="A:\AddFolder\EnvTEST"
set FichierUsager="A:\AddFolder\Usagers.txt"

dir %DossierDesUsagers% /B >%FichierUsager%
Setlocal enableextensions enabledelayedexpansion
for /f "tokens=* delims=" %%A in (%FichierUsager%) do (
set nomprenom=%%A


Par contre je n'arrive pas à créer les dossiers dans le chemin prévue.

Merci d'avance de votre aide
Yann

5 réponses

  1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    Bonjour,

    Essaie comme ça :

    @echo off
    Setlocal enableextensions

    cd /d A:\Production\Usagers || exit /B 1

    for /f "tokens=*" %%E in ('dir /s /b /ad') do (
    if /i "%%~nE"=="BBB" (mkdir "%%~dpnE\Nouveau dossier")
    )

    pause



    “L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
    0
    1. yaphilde Messages postés 35 Statut Membre 2
       
      Merci Barnabe,
      Tu es vraiment trop fort! Ca marche nickel dans mon environnement de test.

      Si tu as un peu de temps à me consacrer, à partir de la ligne 3 de ton code j'ai du mal à comprendre ce qui se passe, si tu pouvais m'expliquer chaque élément, histoire d'être autonome ^^.

      Si ça ne t’embête pas peux tu me modifier le code pour mon environnement de production réel.

      Voici sa structure:
      Dans une arborescence complète voici le chemin exact où je dois rajouter un dossier pour CHAQUE usager.

      F:\CSES\PARTAGE\PROCESSUS DE REALISATION\00 - USAGER\Nom Prénom USAGER\R2 Accompagner\06 - Accompagnement pluridisciplinaire\01 - Scolariser\

      et dans ce dossier je doit créer un dossier nommé "04 - Bulletin de notes". Bien entendu ma variable est ce qui est mis en gras dans le chemin c'est à dire le "Nom Prénom de l'usager".

      Merci d'avance
      0
      1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > yaphilde Messages postés 35 Statut Membre
         
        Ok je vais essayer d'expliquer un peu :

        - ligne 3 : on se positionne (cd /d) dans le dossier où on doit travailler, en même temps je teste si ce dossier existe vraiment, s'il n'existe pas ou s'il est incorrect on sort du script (|| exit /B 1)

        - lignes 4,5,6 : on liste de manière récursive (dir /s) les dossiers/sous-dossiers, grâce à la boucle (for /f) on traite tous ces dossiers/sous-dossiers, lorsqu'on rencontre un dossier BBB (if) on crée un nouveau dossier (mkdir) à l'intérieur.

        L'astuce qui fait la différence : la substitution de variable de la boucle FOR
        Plus d'infos ici : https://stackoverflow.com/questions/5034076/what-does-dp0-mean-and-how-does-it-work
        0
      2. yaphilde Messages postés 35 Statut Membre 2 > barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Merci Barnabe pour ton retour et le lien de Stackoverflow est très interessant.!!
        0
  2. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    Voilà le code pour ton environnement réel :

    @echo off
    Setlocal enableextensions

    set DossierSource=F:\CSES\PARTAGE\PROCESSUS DE REALISATION\00 - USAGER
    set NouveauDossier=04 - Bulletin de notes
    set Cible=01 - Scolariser

    cd /d %DossierSource% || exit /B 1

    for /f "tokens=*" %%E in ('dir /s /b /ad') do (
    if /i "%%~nE"=="%Cible%" (mkdir "%%~dpnE\%NouveauDossier%")
    )

    pause



    “L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
    0
  3. yaphilde Messages postés 35 Statut Membre 2
     
    Merci Barnabe,
    Tu es réellement une ressource précieuse !!

    Alors ton code marche du tonnerre!
    Mais je vais continué à t’embêter un tout petit peu dans la continuité de ce poste.

    La fonction "mkdir" fonctionne nickel, par contre le dossier que je créé doit avoir des droits NTFS différents de son répertoire parent. Dans ce dossier un groupe de professionnels à un droit d'écriture sur ce nouveau dossier.

    J'ai comme piste de remplacer la fonction mkdir par la fonction "Robocopy".
    Dans mon process je peux créer mon nouveau dossier en tant que modele

    je développe:
    J'ai un dossier que je nomme "a:\Dossier de travail" je coupe l'héritage des droits NTFS sur ce dossier.

    Je créé dans ce "Dossier de travail" mon dossier "04 - Bulletin de notes". sur celui ci j'y affecte les droits en écriture pour mon groupe enseignant.

    avec tout les test que j'ai fait rien aboutit.

    voici le type de code pour la fonction Robocopy:
    Robocopy %MaVariablePourMonDossierModele% "%MaVariablePourToutMesDossiersUsagers%\%%A" /E /sec /R:1 /W:1 /TEE ^
    			/LOG+:%MonFichierDeLog%


    Tu imagines bien que ce qui me pose problème c'est la notion de "MaVariablePourToutMesDossiersUsagers"

    Si tu pouvais éclairer mes "petites"lanternes je t'en serai ETERNELLEMENT reconnaissant :-p
    @++
    0
    1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      A vue de nez ça devrait donner ça :
      @echo off
      Setlocal enableextensions

      set DossierSource=F:\CSES\PARTAGE\PROCESSUS DE REALISATION\00 - USAGER
      set NouveauDossier=04 - Bulletin de notes
      set Cible=01 - Scolariser

      cd /d %DossierSource% || exit /B 1

      for /f "tokens=*" %%E in ('dir /s /b /ad') do (
      if /i "%%~nE"=="%Cible%" (
      Robocopy "a:\Dossier de travail" "%%~dpnE" /E /sec /R:1 /W:1 /TEE /LOG+:%MonFichierDeLog%
      )
      )

      pause
      0
  4. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    Tu peux aussi la jouer geek et modifier directement les droits NTFS du nouveau dossier, au lieu d'utiliser un modèle et ROBOCOPY.

    Mais c'est juste une idée comme ça, tu fais comme tu veux ;)

    @echo off
    Setlocal enableextensions

    set DossierSource=F:\CSES\PARTAGE\PROCESSUS DE REALISATION\00 - USAGER
    set NouveauDossier=04 - Bulletin de notes
    set Cible=01 - Scolariser

    cd /d %DossierSource% || exit /B 1

    for /f "tokens=*" %%E in ('dir /s /b /ad') do (
    if /i "%%~nE"=="%Cible%" (
    mkdir "%%~dpnE\%NouveauDossier%"
    icacls "%%~dpnE\%NouveauDossier%" /inheritance:r /grant Administrateurs:(OI)(CI)(W)
    )
    )

    pause

    La partie soulignée est à remplacer par ton groupe enseignant.


    “L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. yaphilde Messages postés 35 Statut Membre 2
     
    Merci Barnabe !!!
    C'est clair la solution Geek et vachement plus propre ^^!

    Par contre j'ai testé le batch et j'ai une erreur que je n'arrive pas à débugger.

    Lorsque j’exécute voici le message que j'ai en retour:

    (CI était inattendu.


    Je pense que c'est un problème avec l'utilisation des variables et le %. Mais je ne suis pas sur.

    Si tu pouvais me dire ... Merci @++
    0
    1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Effectivement il y a un petit amalgame entre les parenthèses de la boucle FOR et les parenthèses des droits NTFS, pour résoudre le problème on va échapper ces dernières comme ceci :

      @echo off
      Setlocal enableextensions

      set DossierSource=F:\CSES\PARTAGE\PROCESSUS DE REALISATION\00 - USAGER
      set NouveauDossier=04 - Bulletin de notes
      set Cible=01 - Scolariser

      cd /d %DossierSource% || exit /B 1

      for /f "tokens=*" %%E in ('dir /s /b /ad') do (
      if /i "%%~nE"=="%Cible%" (
      mkdir "%%~dpnE\%NouveauDossier%"
      icacls "%%~dpnE\%NouveauDossier%" /inheritance:r /grant Administrateurs:(OI^)(CI^)(W^)
      )
      )

      pause
      0
      1. yaphilde Messages postés 35 Statut Membre 2 > barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Coucou Barnabe,
        Je voulais te remercier, ça marche du tonnerre! J'ai utilisé la méthode Geek qui est effectivement supra efficace.

        J'y ai juste apporté quelque modification pour ne pas casser l'héritage.
        Pour information au cas où sa servirait à d'autre voici mon code final:

        @echo off
        Setlocal enableextensions
        
        set DossierSource=F:\CSES\PARTAGE\PROCESSUS DE REALISATION\00 - USAGER
        set NouveauDossier=04 - Cahier de suivi pedagogique
        set Cible=01 - Scolariser
        
        cd /d %DossierSource% || exit /B 1
        
        for /f "tokens=*" %%E in ('dir /s /b /ad') do (
          if /i "%%~nE"=="%Cible%" (
            mkdir "%%~dpnE\%NouveauDossier%"
            icacls "%%~dpnE\%NouveauDossier%" /inheritance:e /grant *S-1-5-21-1504173220-2678980005-1044320739-1104:(OI^)(CI^)(M^)
          )
        )
        
        pause


        J'ai modifié :
        inheritance:r
        en
        inheritance:e


        Bonne journée et merci encore
        0
      2. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > yaphilde Messages postés 35 Statut Membre
         
        Content que ça fonctionne comme tu veux.

        Merci pour le retour, bonne continuation !

        A bientôt peut-être.
        0