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 :

boucle for imbriquées et icacls


Sujet :

Scripts/Batch

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 2
    Points
    2
    Par défaut boucle for imbriquées et icacls
    Bonjour a tous,

    Je requiert un peu d'aide parce que je n'arrive pas a me dépatouiller sur un problème.

    J'ai décider d'appliquer certaines acl via icacls sur une arborescence de répertoires, cette dernière étant assez volumineuse je décide de scripter le tous.

    j'ai vers la fin de l'arbo des dossiers ayant un nom normé pour les dossiers du type "code_etablissement", chacun de ses dossiers disposent d'acl hérité mais certaines ne le sont pas, afin d'appliquer ces acl non hérités je souhaite passer par une boucle for imbriquée car j'ai dans un fichier texte la partie "code" du nom de mes dossiers.

    la boucle fonctionne, mais je n'arrive pas a appliquer mes acl car je n'arrive pas a recuperer le nom complet des dossiers pour les appliquer.

    Voila le code :

    Code batch : 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
    set arbo=mon arbo
     
    set var=0
     
    for /f "tokens=1 delims=," %%a in (C:\SCRIPTS\test.txt) do call :boucle %%a
     
    :boucle
     
    set code_structure=%1
     
    for /r/d "%arbo%" %%j in (%code_structure%) do (if exist "%%j" call :creation_acl %%j)
     
     
    :creation_acl
     
    set var=%*
    set var=%Var:"=%
     
    rem echo -----------------%var%------------------
     
    icacls "%var%" /grant:r groupe_%code_structure%_ETABLISSEMENT:(OI)(IO)(M,DC) /T
    icacls "%var%" /grant:r groupe_%code_structure%_ETABLISSEMENT:(CI)(RA,RD,X,GR,WD)



    L'autre option consisterait a récupérer le nom abrégé des répertoires dans un fichier texte (les répertoires qui m'enquiquine étant toujours au même niveau de l'arbo), comme ca le script devrait fonctionner tel quel

    Merci d'avance pour l'aide charitable

  2. #2
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Personne pour m'aider svp ?

    Je cherche a faire une boucle imbriqué for afin d'appliquer des droits sur des dossiers.

    J'ai crée un fichier texte qui répertorie tous les nom de dossier de type "code_etablissement".

    Je souhaiterai juste qu'une boucle parcours le fichier et que pour chaque ligne de texte di fichier, l'arborescence soit traité de manière récursive jusqu'a trouvé le bon nom de dossier pour y appliquer les acl.

    mon embryon de code fonctionne mais uniquement si je me place au bon endroit dans l'arbo, la récursivité ne fonctionne pas...

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur .NET en devenir
    Inscrit en
    Août 2017
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET en devenir
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 546
    Points : 1 084
    Points
    1 084
    Par défaut
    Bonjour,

    Essaie comme ça :

    Code batch : 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
    @echo off
    setlocal enableextensions
    chcp 1252 >nul
     
    set arbo=mon arbo
     
    cd /d %arbo% || exit /b 1 
     
    for /f "delims=" %%E in ('dir /b /s /ad') do (
     
    	for /f "tokens=1 delims=," %%a in (C:\SCRIPTS\test.txt) do (
    		echo %%~nE | findstr "\<%%a" && call :creation_acl "%%~E" "%%~a"
    	)
    )
     
    exit /b 0
     
    :creation_acl
     
    icacls "%~1" /grant:r groupe_%~2_ETABLISSEMENT:(OI)(IO)(M,DC) /T
    icacls "%~1" /grant:r groupe_%~2_ETABLISSEMENT:(CI)(RA,RD,X,GR,WD)
     
    goto :eof

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Salut Barnabe0057,

    Désolé pour le retard, j'ai été pas mal pris au boulot et je suis sur différents projets, donc je ne peux pas me pencher sur ca h24, j'ai juste eu envie de m'y remettre ce soir par curiosité
    Merci pour le coups de main, j'ai un peu retoucher ton script qui m'a servi de base .

    Tous semble fonctionner, le seul petit point que j'aimerai améliorer c'est la vitesse, en l’état le script passe sur toute l'arbo, c'est ce qu'il faut mais, lorsqu'il a trouvé le bon dossier et appliqué les droits, la boucle continue alors que ça ne sert plus a rien.

    Étant donné que l'arbo en elle même compte plus de 30 000 dossiers, passer au peigne fin mon petit fichier texte et ses 300 entrées pour chacun d'entre eux prend un certain temps...
    Il y a t il un moyen de passer a la ligne suivante du fichier texte une fois que le bon dossier a été trouvé ?
    Je pensai faire ca avec un %errorlevel% ou truc du genre mais je vois pas trop comment faire.

    Voila le code en l’état, fonctionnel mais pas optimisé :

    Code batch : 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
    rem @echo off
    setlocal enableextensions
    chcp 1252 >nul
     
    set arbo=arbo
     
    cd /d %arbo%
     
    for /f "tokens=*" %%E in ('dir /b /s /ad') do (
     
    	for /f "tokens=1*" %%a in (C:\SCRIPTS\fichier.txt) do (
    		echo %%~nE | findstr "\<%%a" && call :creation_acl "%%~E" "%%~a"
     
    	)
    )
     
    :creation_acl
     
    icacls "%~1" /grant:r gg3640dr_%~2_ETABLISSEMENT:(OI)(IO)(M,DC)
    icacls "%~1" /grant:r gg3640dr_%~2_ETABLISSEMENT:(CI)(RA,RD,X,GR,WD)
     
    goto :eof

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur .NET en devenir
    Inscrit en
    Août 2017
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET en devenir
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 546
    Points : 1 084
    Points
    1 084
    Par défaut
    Bonsoir,

    Je ne pense pas qu'on puisse sortir de la boucle, par contre on peut l'optimiser.
    Je peux largement améliorer la vitesse du script, à condition de voir le contenu de ton fichier texte.

    Bonne nuit.

  6. #6
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Salut Barnabe,

    Le fichier texte contient la sortie d'une commande DIR sur un niveau de mon arborescence, les lignes on toujours les mêmes infos dans ce style :

    Code structure nom etablissement

    Un exemple bidon pour imager :

    01722 etablissement 1
    01410 etablissement 2
    01595 etablissement 3
    etc....

    La chose a retenir c'est que le code structure est toujours sur 5 chiffres, viens ensuite l’établissement qui est toujours sépare par un espace du code structure.

    Les code structures ne sont pas rangés par ordre croissant ou décroissant dans l'arbo, donc ils ne le sont pas non plus dans le fichier texte, le nom de l’établissement quant a lui n'est pas normé, donc on peux très bien avoir un truc du genre :

    01722 neuilly les oies
    01410 sarseine les bains en charogne
    01595 j'ai pas d'idee

    Après si il faut vraiment, je te fournis un bout du fichier texte mais tu ne va rien apprendre de plus que ce que je te dis là .

    Si les dossiers établissement étaient tous placé dans le même dossier, je me contenterai d'un "for /d" dans la première boucle en remaniant un peu le script, mais ils sont dans plusieurs dossiers; Au même niveau de l'arbo mais disséminer dans plusieurs dossiers.

    D'ou le fait de s'imposer la récursivité.

    Pour le moment j'utilise un script que j'avais fait durant le temps de réponse, il m'oblige a éditer la variable de l'arbo pour "placer" la boucle au bon endroit, m'obligeant a redeclnecher le script plusieurs fois mais ca va toujours biehn plus vite que de tous faire a la mains...

    Le bout de code si ca t'interesse :

    Code batch : 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
    set arbo=mon arbo
    set var=0
     
    for /f "tokens=*" %%a in (C:\SCRIPTS\fichier.txt) do call :boucle %%a
     
    :boucle
     
    set code_structure=%1
     
    for /d %%j in ("%code_structure%") do (if exist "%%j" call :creation_acl %%j)
     
    :creation_acl
     
    set var=%*
    set var=%Var:"=%
     
    icacls "%arbo%\%var%" /grant:r groupe_%code_structure%_ETABLISSEMENT:(OI)(CI)(RX)
     
    :creation_acl_dossier
     
    icacls "%arbo%\%var%\%dossier_1%" /grant:r groupe_%code_structure%_ETABLISSEMENT:(OI)(IO)(RX) /T
    icacls "%arbo%\%var%\%dossier_1%" /grant:r groupe_%code_structure%_ETABLISSEMENT:(CI)(RA,RD,X,GR,WD)
    icacls "%arbo%\%var%\%dossier_1%" /grant:r groupe2:(CI)(RA,RD,X,GR,WD)
    icacls "%arbo%\%var%\%dossier_1%" /grant:r groupe3:(OI)(IO)(M,DC)
     
    etc...

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur .NET en devenir
    Inscrit en
    Août 2017
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET en devenir
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 546
    Points : 1 084
    Points
    1 084
    Par défaut
    Bonjour,

    Dis-moi si cela te convient ou pas :

    Code batch : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    @echo off
    setlocal enableextensions enabledelayedexpansion
    chcp 1252 >nul
     
    set arbo=mon arbo
     
    cd /d %arbo% || exit /b 1
     
    for /f "tokens=1,*" %%A in (C:\SCRIPTS\test.txt) do (call :correspondance %%A "%%~B")
     
    echo. & pause
    exit /b 0
     
     
     
    :correspondance
    set match=0
     
    for /f "tokens=*" %%J in ('dir /b /ad /s') do (
     
    	if !match! NEQ 1 (if /i "%%~nJ"=="%1 %~2" (
    		  	  	set match=1
    		  	  	call :creation_acl %1 "%%~J"
    		  	  )
    	)
    )
    goto :eof
     
     
     
    :creation_acl
     
    icacls "%~2" /grant:r groupe_%1_ETABLISSEMENT:(OI)(CI)(RX) /inheritance:e
     
     
    :creation_acl_dossier
     
    icacls "%~2\%dossier_1%" /grant:r groupe_%1_ETABLISSEMENT:(OI)(IO)(RX) /T
    icacls "%~2\%dossier_1%" /grant:r groupe_%1_ETABLISSEMENT:(CI)(RA,RD,X,GR,WD)
    icacls "%~2\%dossier_1%" /grant:r groupe2:(CI)(RA,RD,X,GR,WD)
    icacls "%~2\%dossier_1%" /grant:r groupe3:(OI)(IO)(M,DC)
     
    goto :eof

    Je ne suis pas certain d'avoir compris ce qu'est ta variable %dossier_1%

Discussions similaires

  1. Boucles for imbriquées
    Par The eye dans le forum ASP
    Réponses: 2
    Dernier message: 19/07/2007, 12h00
  2. Boucle for imbriqué
    Par boula dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 18/07/2007, 12h42
  3. 2 boucles for imbriquées
    Par karimphp dans le forum Langage
    Réponses: 8
    Dernier message: 02/12/2006, 14h46
  4. Batch - Deux boucle For imbriquées plus un FC
    Par Lorponos dans le forum Windows
    Réponses: 17
    Dernier message: 27/07/2006, 14h58
  5. [Syntaxe] Boucle For imbriquées en 1.5
    Par Piolet dans le forum Langage
    Réponses: 5
    Dernier message: 09/01/2005, 00h49

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