Ajout dossier dans arborescence avec une variable

Résolu/Fermé
yaphilde Messages postés 35 Date d'inscription lundi 9 janvier 2017 Statut Membre Dernière intervention 25 octobre 2022 - 23 nov. 2017 à 15:45
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 - 5 déc. 2017 à 05:27
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

barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 907
Modifié le 24 nov. 2017 à 00:05
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
yaphilde Messages postés 35 Date d'inscription lundi 9 janvier 2017 Statut Membre Dernière intervention 25 octobre 2022 2
24 nov. 2017 à 09:52
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
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 907 > yaphilde Messages postés 35 Date d'inscription lundi 9 janvier 2017 Statut Membre Dernière intervention 25 octobre 2022
24 nov. 2017 à 20:11
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
yaphilde Messages postés 35 Date d'inscription lundi 9 janvier 2017 Statut Membre Dernière intervention 25 octobre 2022 2 > barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024
27 nov. 2017 à 11:41
Merci Barnabe pour ton retour et le lien de Stackoverflow est très interessant.!!
0
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 907
Modifié le 24 nov. 2017 à 20:27
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
yaphilde Messages postés 35 Date d'inscription lundi 9 janvier 2017 Statut Membre Dernière intervention 25 octobre 2022 2
27 nov. 2017 à 11:39
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
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 907
27 nov. 2017 à 23:17
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
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 907
Modifié le 27 nov. 2017 à 23:51
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yaphilde Messages postés 35 Date d'inscription lundi 9 janvier 2017 Statut Membre Dernière intervention 25 octobre 2022 2
28 nov. 2017 à 14:42
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
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 907
28 nov. 2017 à 20:58
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
yaphilde Messages postés 35 Date d'inscription lundi 9 janvier 2017 Statut Membre Dernière intervention 25 octobre 2022 2 > barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024
4 déc. 2017 à 11:04
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
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 907 > yaphilde Messages postés 35 Date d'inscription lundi 9 janvier 2017 Statut Membre Dernière intervention 25 octobre 2022
5 déc. 2017 à 05:27
Content que ça fonctionne comme tu veux.

Merci pour le retour, bonne continuation !

A bientôt peut-être.
0