jeudi 23 août 2012

Les boucles FOR du Batch ...

Aujourd'hui, un petit retour au Batch ... (<= Jeu de mot débile.. retour/boucle .. nan ? ok j'me cache)

Parce que le Batch, c'est toujours aussi bien, et que même si il laisse de plus en plus de place au Shell, il est toujours présent et continue à rendre pas mal de services ...

Une utilisatrice a souhaitée avoir une liste des droits attribués sur un dossier à sa charge sur le réseau.

LE reflex du geek => "Super, on Batch !"

But du jeu : avoir les droits descendus sur tous les sous-dossier d'un Folder particulier.

Les armes : 
¤ - le fameux FOR pour initialiser la boucle accompagné d'un /D pour scanner un dossier, d'un /R pour avoir les droits appliqués sur les sous dossiers et fichiers. Ici, on utilisera le /F à partir d'un fichier texte, généré par ...
¤ - ... Le DIR qui sert à regarder à l’intérieur d'un dossier
¤ - Le CACLS, une commande permettant de lister les droits d'un dossier/fichier ou/et de les changer de manière massive (Toujours bon a retenir celui la)

Le jeu se déroule en deux manches. Dans la première ont commence par lister les dossiers avec la commande :
Dir destination /A:D /B /S > D:\ListeRep.txt

Explication de la commande : DIR est la commande qui sert à Lister l’intérieur d'un dossier les arguments :
/A:D                     Afin de cibler les dossiers
/B                         Permet d'obtenir les chemins
/S                          Récurrence sur les sous dossiers du dossier visé
> destination       Va écrire le résultat dans un fichier

Deuxième partie, ont applique la boucle FOR qui sert à répéter une action a exécuter tant que la condition est vraie. Ici la condition va être la présence d'un dossier.
La commande est la suivante :
FOR /F "Usebackq delims=;" %%i in (D:\ListeRep.txt) do (
CACLS %%i >> D:\LogListeRep.log
)
Cela parait un peu barbare.
Explications :
FOR est la commande qui initialise la boucle
/F                   Permet de lire un fichier texte il peut être comme ici suivis d'arguments
Usebackq       Indique au programme que des arguments complexes vont être utilisés
delims=;          Va indiquer à la commande que les lignes doivent êtres envoyés en entier jusqu'à la rencontre d'un délimitateur, ici ; mais on peut utiliser autre chose.
%%i              Est la variable remplis par les résultats. Ont batch, donc on double le "%"
in()                  L'emplacement du fichier liste
CACLS          Ont demande à chaque occurence trouvée d'appliquer la commande CACLS qui permet de lister les droits sur un dossier (d'où l'indication de la variable %%i juste derrière)
>>                  Permet de rajouter des lignes au fichier créé précédemment.

Voila la commande au complet. J'ai initier un Pause>null au milieu du programme afin de rajouter des guillemets et un ; a la fin de chaque lignes avec Notepad++ par manque de temps.
Cela donne au final :

@Echo Off
Echo %Date%  > D:\LogListeRep.log
Echo %Time% >> D:\LogListeRep.log
Dir \\Destination /A:D /B /S > D:\ListeRep.txt
Pause>Null
FOR /F "Usebackq delims=;" %%i in (D:\ListeRep.txt) do (
CACLS %%i >> D:\LogListeRep.log
)

Voilà, pas très compliqué mais sacrément utile
A noter qu'une extraction sous Excel est tout à fait possible en replaçant le .log par un .xls, mais il faudra le trier pour que cela soit exploitable.

Au plaisir ...