Ajout dossier dans arborescence avec une variable [Résolu]

yaphilde 20 Messages postés lundi 9 janvier 2017Date d'inscription 4 décembre 2017 Dernière intervention - 23 nov. 2017 à 15:45 - Dernière réponse : barnabe0057 11655 Messages postés lundi 2 mars 2009Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention
- 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


Afficher la suite 
20Messages postés lundi 9 janvier 2017Date d'inscription 4 décembre 2017 Dernière intervention

12 réponses

Répondre au sujet
barnabe0057 11655 Messages postés lundi 2 mars 2009Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - Modifié par barnabe0057 le 24/11/2017 à 00:05
0
Utile
3
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.”
yaphilde 20 Messages postés lundi 9 janvier 2017Date d'inscription 4 décembre 2017 Dernière intervention - 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
barnabe0057 11655 Messages postés lundi 2 mars 2009Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention > yaphilde 20 Messages postés lundi 9 janvier 2017Date d'inscription 4 décembre 2017 Dernière intervention - 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
yaphilde 20 Messages postés lundi 9 janvier 2017Date d'inscription 4 décembre 2017 Dernière intervention > barnabe0057 11655 Messages postés lundi 2 mars 2009Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - 27 nov. 2017 à 11:41
Merci Barnabe pour ton retour et le lien de Stackoverflow est très interessant.!!
Commenter la réponse de barnabe0057
barnabe0057 11655 Messages postés lundi 2 mars 2009Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - Modifié par barnabe0057 le 24/11/2017 à 20:27
0
Utile
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.”
Commenter la réponse de barnabe0057
yaphilde 20 Messages postés lundi 9 janvier 2017Date d'inscription 4 décembre 2017 Dernière intervention - 27 nov. 2017 à 11:39
0
Utile
1
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
@++
barnabe0057 11655 Messages postés lundi 2 mars 2009Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - 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
Commenter la réponse de yaphilde
barnabe0057 11655 Messages postés lundi 2 mars 2009Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - Modifié par barnabe0057 le 27/11/2017 à 23:51
0
Utile
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.”
Commenter la réponse de barnabe0057
yaphilde 20 Messages postés lundi 9 janvier 2017Date d'inscription 4 décembre 2017 Dernière intervention - 28 nov. 2017 à 14:42
0
Utile
3
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 @++
barnabe0057 11655 Messages postés lundi 2 mars 2009Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - 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
yaphilde 20 Messages postés lundi 9 janvier 2017Date d'inscription 4 décembre 2017 Dernière intervention > barnabe0057 11655 Messages postés lundi 2 mars 2009Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - 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
barnabe0057 11655 Messages postés lundi 2 mars 2009Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention > yaphilde 20 Messages postés lundi 9 janvier 2017Date d'inscription 4 décembre 2017 Dernière intervention - 5 déc. 2017 à 05:27
Content que ça fonctionne comme tu veux.

Merci pour le retour, bonne continuation !

A bientôt peut-être.
Commenter la réponse de yaphilde