Question
Création de groupes avec un fichier CSV (Résolu)
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 16 ans 1 mois #794
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Création de groupe avec un fichier
Il faut transmettre les infos du fichier csv à la boucle foreach. Le moyen le plus courant dans PowerShell c'est de faire un pipeline:
[code:1]
get-content d:\...\...dbo.csv | foreach {
$objOU.Create(\"group\",\"cn=$_\"«»)
}[/code:1]
Comme tu le constates, la principale (sinon la seule) différence avec ton propre code, c'est l'enchaînement entre l'instruction get-content et la boucle foreach symbolisé par le \"|\". Avec ce symbole, chaque objet retourné par get-content (c'est-à-dire chaque ligne du fichier) est passé aux instructions de la boucle foreach. Et comme tu l'avais déjà compris, on y accède par le nom de variable $_.
J'ai également regroupé \"cn=\" et $_ dans une même chaîne de caractères. Quand tu mets une chaîne entre guillemets (doubles), les noms de variables sont convertis en leur valeur avant de passer la chaîne à l'instruction.
Cette conversion n'est pas faite lorsque la chaîne est placée entre apostrophes (ou guillemets simples), comme par exemple:
[code:1]
PS> $world = \"la France\"
PS> \"Hello $world\"
Hello la France
PS> 'Hello $world'
Hello $world[/code:1]
Janel
[code:1]
get-content d:\...\...dbo.csv | foreach {
$objOU.Create(\"group\",\"cn=$_\"«»)
}[/code:1]
Comme tu le constates, la principale (sinon la seule) différence avec ton propre code, c'est l'enchaînement entre l'instruction get-content et la boucle foreach symbolisé par le \"|\". Avec ce symbole, chaque objet retourné par get-content (c'est-à-dire chaque ligne du fichier) est passé aux instructions de la boucle foreach. Et comme tu l'avais déjà compris, on y accède par le nom de variable $_.
J'ai également regroupé \"cn=\" et $_ dans une même chaîne de caractères. Quand tu mets une chaîne entre guillemets (doubles), les noms de variables sont convertis en leur valeur avant de passer la chaîne à l'instruction.
Cette conversion n'est pas faite lorsque la chaîne est placée entre apostrophes (ou guillemets simples), comme par exemple:
[code:1]
PS> $world = \"la France\"
PS> \"Hello $world\"
Hello la France
PS> 'Hello $world'
Hello $world[/code:1]
Janel
Connexion ou Créer un compte pour participer à la conversation.
- big_cham
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 24
- Remerciements reçus 0
il y a 16 ans 2 mois #796
par big_cham
Réponse de big_cham sur le sujet Re:Création de groupe avec un fichier
Alors il n'y a aucune différence entre foreach avec un pipe et foreach-object ?
Sinon, voici le résultat en mode intéractif :
Du coup, pas de groupes...
Pourtant si je laisse le get-content seul, j'ai bien l'affichage de toutes les lignes.
Je retire la deuxième partie du message. J'ai oublié le setinfo...
Savez vous pourquoi le nom pre-goup win2000 n'a aucun sens ? Est ce une limitation de powershell et de 2000 ?<br><br>Message édité par: big_cham, à: 1/08/07 09:10
Sinon, voici le résultat en mode intéractif :
distinguishedName
{}
{}
{}
{}
Du coup, pas de groupes...

Pourtant si je laisse le get-content seul, j'ai bien l'affichage de toutes les lignes.
Je retire la deuxième partie du message. J'ai oublié le setinfo...
Savez vous pourquoi le nom pre-goup win2000 n'a aucun sens ? Est ce une limitation de powershell et de 2000 ?<br><br>Message édité par: big_cham, à: 1/08/07 09:10
Connexion ou Créer un compte pour participer à la conversation.
- Robin Lemesle
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 260
- Remerciements reçus 0
il y a 16 ans 2 mois #797
par Robin Lemesle
Non, regarde cette commande !
[code:1]get-alias -name foreach[/code:1]
Foreach est un alias de ForeachObject.
Le pipe ne sert juste qu'a envoyer l'objet de sortie vers l'entrée de la commande située après le pipe (Foreach).
Robin MVP PowerShell
Réponse de Robin Lemesle sur le sujet Re:Création de groupe avec un fichier
Alors il n'y a aucune différence entre foreach avec un pipe et foreach-object ?
Non, regarde cette commande !
[code:1]get-alias -name foreach[/code:1]
Foreach est un alias de ForeachObject.
Le pipe ne sert juste qu'a envoyer l'objet de sortie vers l'entrée de la commande située après le pipe (Foreach).
Robin MVP PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- big_cham
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 24
- Remerciements reçus 0
il y a 16 ans 2 mois #798
par big_cham
Réponse de big_cham sur le sujet Re:Création de groupe avec un fichier
Ok. Pas d'idée sur mon pre-windows 2000 name ?
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 16 ans 2 mois #799
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Création de groupe avec un fichier
robin écrit:
et c'est en fait une des ambiguités cachées de PowerShell...
Dans la structure \"commande1 | foreach {faire qq chose avec $_}\", foreach est bien un alias de la commandelette foreach-object: pour avoir de l'aide sur ce foreach, on peut taper \"help foreach\" ou \"help foreach-object\".
Mais dans la structure \"foreach ($item in $collection) {faire qq chose avec $item}\", foreach est un mot-clé de PowerShell: il faut taper \"help about_foreach\" pour avoir une aide complète sur ce mot-clé.
Subtil, non?
Qu'est-ce que ça change, concrètement? Au moins deux choses:
1. Les performances.
Comme déjà évoqué dans un fil précédent, la première structure, \"foreach ($item in $collection) {...}\", attend d'avoir entièrement collecté $collection avant de passer aux opérations sur chaque $item. A l'inverse, \"commande1 | foreach {...}\" transmet les objets émis par commande1 au bloc d'instructions de foreach au fur et à mesure où ils sont émis. Dans certains cas, cette différence peut se révéler cruciale.
2. La syntaxe.
Avec foreach-object on peut enchaîner des actions \"avant\", \"pendant\" et \"après\" le traitement des objets:
[code:1]PS> get-process | foreach {\"Liste des process:\"} {$_} {\"`nFin de liste.\"}[/code:1]
Après foreach (ici, l'alias de foreach-object) on peut voir trois blocs d'instructions: le premier qui affiche le texte \"Liste des process:\" sera traité avant de commencer à traiter le premier objet. Le deuxième bloc sera traité pour chaque objet passé par le pipeline. Et pour finir, le troisième bloc sera traité une fois le pipeline vide et le dernier objet traité.
Janel
Ben, en fait c'est un peu plus compliqué que ça
Alors il n'y a aucune différence entre foreach avec un pipe et foreach-object ?
Non, regarde cette commande !
[code:1]get-alias -name foreach[/code:1]
Foreach est un alias de ForeachObject.
Le pipe ne sert juste qu'a envoyer l'objet de sortie vers l'entrée de la commande située après le pipe (Foreach).

Dans la structure \"commande1 | foreach {faire qq chose avec $_}\", foreach est bien un alias de la commandelette foreach-object: pour avoir de l'aide sur ce foreach, on peut taper \"help foreach\" ou \"help foreach-object\".
Mais dans la structure \"foreach ($item in $collection) {faire qq chose avec $item}\", foreach est un mot-clé de PowerShell: il faut taper \"help about_foreach\" pour avoir une aide complète sur ce mot-clé.
Subtil, non?
Qu'est-ce que ça change, concrètement? Au moins deux choses:
1. Les performances.
Comme déjà évoqué dans un fil précédent, la première structure, \"foreach ($item in $collection) {...}\", attend d'avoir entièrement collecté $collection avant de passer aux opérations sur chaque $item. A l'inverse, \"commande1 | foreach {...}\" transmet les objets émis par commande1 au bloc d'instructions de foreach au fur et à mesure où ils sont émis. Dans certains cas, cette différence peut se révéler cruciale.
2. La syntaxe.
Avec foreach-object on peut enchaîner des actions \"avant\", \"pendant\" et \"après\" le traitement des objets:
[code:1]PS> get-process | foreach {\"Liste des process:\"} {$_} {\"`nFin de liste.\"}[/code:1]
Après foreach (ici, l'alias de foreach-object) on peut voir trois blocs d'instructions: le premier qui affiche le texte \"Liste des process:\" sera traité avant de commencer à traiter le premier objet. Le deuxième bloc sera traité pour chaque objet passé par le pipeline. Et pour finir, le troisième bloc sera traité une fois le pipeline vide et le dernier objet traité.
Janel
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 16 ans 2 mois #800
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Création de groupe avec un fichier
big_cham écrit:
Ce n'est pas une limitation de PowerShell mais une contrainte d'ADSI. Dans ton instruction $objOU.Create(\"group\", $_) il faut que $_ soit sous la forme d'un Distinguished Name (DN), c'est-à-dire \"CN=mon groupe,OU=mon OU,DC=mondomaine,DC=maboite,DC=com\".
Il existe des techniques pour interroger un DC en utilisant la forme pré-2000, mais j'ignore si on peut créer un groupe dans une OU en utilisant cette syntaxe. A creuser si tu ne peux pas utiliser le DN, mais à priori rien ne devrait t'en empêcher car tu dois avoir toutes les infos pour le reconstituer.
Janel
Savez vous pourquoi le nom pre-goup win2000 n'a aucun sens ? Est ce une limitation de powershell et de 2000 ?
Ce n'est pas une limitation de PowerShell mais une contrainte d'ADSI. Dans ton instruction $objOU.Create(\"group\", $_) il faut que $_ soit sous la forme d'un Distinguished Name (DN), c'est-à-dire \"CN=mon groupe,OU=mon OU,DC=mondomaine,DC=maboite,DC=com\".
Il existe des techniques pour interroger un DC en utilisant la forme pré-2000, mais j'ignore si on peut créer un groupe dans une OU en utilisant cette syntaxe. A creuser si tu ne peux pas utiliser le DN, mais à priori rien ne devrait t'en empêcher car tu dois avoir toutes les infos pour le reconstituer.
Janel
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.054 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Création de groupes avec un fichier CSV (Résolu)