Question
Powershell et fichier CSV
- legallux
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 3
- Remerciements reçus 0
Je travail actuellement sur un script Powershell pour mon entreprise.
Le but du script est d'ajouter/supprimer ou modifier des comptes AD à l'aide d'un fichier .CSV qui contient des informations.
Le script doit permettre de différencier l'action ajouter/supprimer ou modifier grâce à la première lettre de chaque ligne du fichier .CSV qui sera soit un A pour ajouter, soit un S pour supprimer soit un M pour modifier.
Voici a quoi ressemble le contenu du fichier test.CSV :
lettre;Description;Surname;GivenName;Displayname;AccountExpirationDate;Name;Password;
A;1264684;CATHELAINE;roger;18/10/1960;03/05/2015;L008922;78901940;
S;45634646;NICOLE;florent;17/07/1976;15/03/2014;L001204;45671966;
M;25326341;MEHMACHE;Leila;07/06/1966;26/11/2015;L004505;12361956;
On peut voir que les informations son séparés par des \";\" et placés de façon à être récupérés par colonne grâce aux attribut AD de la première ligne :
lettre;Description;Surname;GivenName;Displayname;AccountExpirationDate;Name;Password;
Et voici la partie de mon script qui pose problème :
[code:1]$lettre=$lettre.lettre #Attribut permettant de déclaré que le mot \"lettre\" du fichier .CSV correspond a la variable $lettre
$x = get-content \"C:\test.csv\" #récupération du fichier .CSV dans l variable $x[/code:1]
[code:1]
$x[1..$x.count] | foreach-object {$lettre.lettre -cmatch \"S\" -in $x} | out-file \"C:\test10.csv\"
[/code:1]
#Ci dessus la partie qui ne fonctionne pas
Je m'explique, le but étant de différencier les actions en fonction de la première lettre de chaque ligne, j'ai donc imaginer qu'il fallait utiliser la variable $lettre qui contiendrai alors la première lettre de chaque ligne. Pour cela j'ai utilisé une logique semblable à celle utilisé avec les attribut AD, c'est à dire : -Name $Name.name mais sous la forme $lettre.lettre de manière à récupéré les lettres présentes dans la colonne \"lettre\" le lettre se comporterai comme un attribut. Et cela ne fonctionne pas.
Pour info, voici la boucle pour le reste de mon script ;
[code:1]$Users=import-csv -delimiter \";\" -Path \"C:\test0.csv\"
foreach ($lettre in $Users){
if ($lettre -match \"M\"«»){
foreach ($User in $Users){
Set-ADUser -Name $User.Name -Description $User.Description -Surname $User.Surname -GivenName $User.GivenName -Displayname $User.Displayname -AccountExpirationDate $User.AccountExpirationDate -Path \"OU=test,DC=MED,DC=FR\"
#Add-ADGroupMember -Identity \"utilisateur de la med\" -Members $User.SamAccountName
}}
}
if ($lettre -match \"S\"«»){
foreach ($User in $Users){
Remove-ADUser -Name $User.Name -Description $User.Description -Surname $User.Surname -GivenName $User.GivenName -Displayname $User.Displayname -AccountExpirationDate $User.AccountExpirationDate -Path \"OU=test,DC=MED,DC=FR\"
#Add-ADGroupMember -Identity \"utilisateur de la med\" -Members $User.SamAccountName
}}
if ($lettre -match \"A\"«»){
foreach ($User in $Users){
New-ADUser -Name $User.Name -Description $User.Description -Surname $User.Surname -GivenName $User.GivenName -Displayname $User.Displayname -AccountExpirationDate $User.AccountExpirationDate -Path \"OU=test,DC=MED,DC=FR\"
#Add-ADGroupMember -Identity \"utilisateur de la med\" -Members $User.SamAccountName
}}
}
[/code:1]
Pouvez-vous m'aider?
Merci d'avance !
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
oui bien sur mais en échange tu nous aide en mettant code sur les partie script stpPouvez-vous m'aider?
pour cella tu surligne ton code et tu clique sur le bouton code au dessus de la zone de saisi du test
tu peut editer (modifier) ton post
merci
ta un problème d'analyse :
ta une première boucle sur $users ok mais apres en cascade une deuxième boucle ?
quand je lis ton script, des qu'un utilisateur est en modification tu modifie tous les utilisateurs idem pour supprimer et ajouter !!!
que contient $lettre ? ou l'initialise tu ? ici : foreach ($lettre in $Users){ ?#Ci dessus la partie qui ne fonctionne pas
enfin {$lettre.lettre -cmatch \"S\" -in $x} ne ne fais rien !
tu compare toujours la même lettre \"$lettre.lettre\" a \"S\" ?
et le -in $x je sais pas ce que ca va faire dans ce cas mais $x contient tous ton fichier et pas que la colonne lettre !!<br><br>Message édité par: 6ratgus, à: 11/02/15 10:15
Connexion ou Créer un compte pour participer à la conversation.
- legallux
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 3
- Remerciements reçus 0
Le but de la deuxième boucle en cascade est d'effectuer une action différente en fonction du if.
pour un exemple avec la lettre M ;
[code:1]foreach ($lettre in $Users){
#Pour chaque lettre dans le fichier .CSV
if ($lettre -match \"M\"«»){
#Si la lettre est égale à M
foreach ($User in $Users){
#pour chaque attrubut AD dans le fichier .CSV
# ==> Faire Set-ADuser
[/code:1]
Effectivement la réalité des choses est différente pouisqu'il execute les 3 commandes :/
la variable $lettre contient la lettre \"M\" \"S\" ou \"A\" en fonction du fichier csv
je la déclare de cette façon :
[code:1]$lettre=$lettre.lettre[/code:1]
Pou la ligne
[code:1]$x[1..$x.count] | foreach-object {$lettre.lettre -cmatch \"S\" -in $x} | out-file \"C:\test10.csv\"
[/code:1]
J'ai oublier de précisé que c'etait une ligne de test pour essayer de récupérer la première lettre de chaque ligne,
vérifier si elle est égale à S dans le fichier .CSV contenu dans $x (dans cet exemple uniquement car on aurait pu mettre un A ou un M)
Pour voir le résultat j'ai rajouté un out-file vers le fichier test10.csv.
Oui Effectivement, j'ai remarqué que cela ne fonctionnai pas car $x contient tout le fichier et pas que les lettres de la colonne lettre.
Le le but du $x[1..$x.count] était de précisé passer sur chaque ligne une par une pour récupéré chaque lettre.
Enfin désolé je sais que c'est très bancale, c'est pour ça que je demande de l'aide ahah!
Merci encore !
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
merci beaucoupMerci pour la réponse 6ratgus et dsl pour le code je vais rectifier ça.
mais tu fais pas de if dans ta deuxième boucle donc donc tu travail sur tous les users !Le but de la deuxième boucle en cascade est d'effectuer une action différente en fonction du if.
ta deuxième boucle imbriqué est inutile
sans vouloir te contredir tu met rien dans $lettre sauf si $lettre.lettre contient quelque chosela variable $lettre contient la lettre \"M\" \"S\" ou \"A\" en fonction du fichier csv
je la déclare de cette façon :
[code:1]$lettre=$lettre.lettre[/code:1]
mais ton problème ne viens pas de là !
Oui Effectivement, j'ai remarqué que cela ne fonctionnai pas car $x contient tout le fichier et pas que les lettres de la colonne lettre.
Le le but du $x[1..$x.count] était de précisé passer sur chaque ligne une par une pour récupéré chaque lettre.
le code qui fonctionne :
[code:1]$x | foreach-object {$_.lettre -cmatch \"S\"} | out-file \"C:\test10.csv\" [/code:1]
petite explication :
[code:1]$x |[/code:1]parce qu'il n'en faut pas plus pour listé tous les éléments d'un objet (ici les utilisateurs)
[code:1]foreach-object {$_.lettre -cmatch \"S\"} [/code:1]
le foreach va travailler sur chaque élément transmis dans le pipeline ! un à un
dans un pipeline chaque éléments est transmis dans la variable $_. donc la lettre est accessible par $_.lettre
-cmatch \"S\" rien à dire sauf que -eq fonctionne aussi si on a saisi qu'une lettre ou encore -clike \"*S*\"
powershell ne tiens pas compte de la case par défaut mais c'est bien de le précisé dans tout les cas
le -in $x ne sert à rien ici
la ta tout pour que ca marche !!Enfin désolé je sais que c'est très bancale, c'est pour ça que je demande de l'aide ahah!
de rienMerci encore !
dis nous si çà marche !!
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
rems écrit:
[code:1]$lettre=$lettre.lettre[/code:1]
Au secours !!!
Un conseil, prends le temps de nommer tes variables et les propriétés de tes objets, là c'est illisible.
Une proposition de nommage 'Action' (Traitement/Operation...) au lieu de 'Lettre'.
L'instruction Switch facilite la construction de ce type de traitement :
[code:1]
@'
Action;Description;Surname;GivenName;Displayname;AccountExpirationDate;Name;Password;
A;1264684;CATHELAINE;roger;18/10/1960;03/05/2015;L008922;78901940;
S;45634646;NICOLE;florent;17/07/1976;15/03/2014;L001204;45671966;
M;25326341;MEHMACHE;Leila;07/06/1966;26/11/2015;L004505;12361956;
Z;25326341;MEHMACHE;Leila;07/06/1966;26/11/2015;L004505;12361956;
'@ > c:\temp\datas.csv
$Users=import-csv -delimiter \";\" -Path c:\temp\datas.csv
foreach ($User in $Users){
Switch ($User.Action) {
\"M\" {
\"Set-ADUser -> $User `r`n\"
#Set-ADUser -Name $User.Name -Description $User.Description -Surname $User.Surname -GivenName $User.GivenName -Displayname $User.Displayname -AccountExpirationDate $User.AccountExpirationDate -Path \"OU=test,DC=MED,DC=FR\"
#Add-ADGroupMember -Identity \"utilisateur de la med\" -Members $User.SamAccountName
}
\"S\" {
\"Remove-ADUser -> $User `r`n\"
#Remove-ADUser -Name $User.Name -Description $User.Description -Surname $User.Surname -GivenName $User.GivenName -Displayname $User.Displayname -AccountExpirationDate $User.AccountExpirationDate -Path \"OU=test,DC=MED,DC=FR\"
#Add-ADGroupMember -Identity \"utilisateur de la med\" -Members $User.SamAccountName
}
\"A\" {
\"New-ADUser -> $User `r`n\"
#New-ADUser -Name $User.Name -Description $User.Description -Surname $User.Surname -GivenName $User.GivenName -Displayname $User.Displayname -AccountExpirationDate $User.AccountExpirationDate -Path \"OU=test,DC=MED,DC=FR\"
#Add-ADGroupMember -Identity \"utilisateur de la med\" -Members $User.SamAccountName
}
default { Write-Error \"Action '$_' inconnue pour la ligne :$User\" }
}#switch
}#Foreach
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- legallux
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 3
- Remerciements reçus 0
Désolé je viens tout juste de reprendre le travail et de tester le script.
Merci beaucoup pour vos réponses! c'est génial
Le \"switch\" fonctionne bien, puisqu'il exécute la commande qui correspond à la lettre (M = Set-ADuser par exemple) et il facilite grandement la tâche.
Il me reste un petit souci
(Pour la lettre S)
[code:1]Remove-ADUser : Impossible de trouver un paramètre correspondant au nom « Name ».
Au caractère Ligne:19 : 25
+ Remove-ADUser -Name $User.Name -Description $User.Description -Surname ...
+ ~~~~~
+ CategoryInfo : InvalidArgument : (:«») [Remove-ADUser], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.ActiveDirectory.Management.Commands
.RemoveADUser[/code:1]
(Pour la lettre M)
[code:1]Set-ADUser : Impossible de trouver un paramètre correspondant au nom « Name ».
Au caractère Ligne:14 : 22
+ Set-ADUser -Name $User.Name -Description $User.Description -Surname $U ...
+ ~~~~~
+ CategoryInfo : InvalidArgument : (:«») [Set-ADUser], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.ActiveDirectory.Management.Commands
.SetADUser[/code:1]
(sachant que j'ai pris en compte le fait que les utilisateurs doivent déjà exister dans l'AD pour qu'on puisse les supprimer ou les modifier)
Je pense que l'erreur vient du $User.Name, en gros il ne trouve pas le bon nom dans l'AD pour faire correspondre le nom d'utilisateur avec le fichier et savoir quel est le compte à supprimer, donc il ne fait rien.
Merci beaucoup !
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Powershell et fichier CSV