Ajout dossier dans arborescence avec une variable
Résolu
yaphilde
Messages postés
35
Date d'inscription
Statut
Membre
Dernière intervention
-
barnabe0057 Messages postés 14455 Date d'inscription Statut Contributeur Dernière intervention -
barnabe0057 Messages postés 14455 Date d'inscription Statut Contributeur Dernière intervention -
A voir également:
- Ajout dossier dans arborescence avec une variable
- Dossier appdata - Guide
- Impossible de supprimer un dossier - Guide
- Proteger un dossier avec mot de passe - Guide
- Dossier rar - Guide
- Dossier démarrage - Guide
5 réponses
Bonjour,
Essaie comme ça :
“L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
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.”
Voilà le code pour ton environnement réel :
“L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
@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.”
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:
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
@++
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
@++
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
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 ;)
La partie soulignée est à remplacer par ton groupe enseignant.
“L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
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.”
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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:
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 @++
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 @++
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
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:
J'ai modifié :
inheritance:r
en
inheritance:e
Bonne journée et merci encore
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
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
- 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