Question Powershell, les tableaux et les fichiers CSV

Plus d'informations
il y a 11 ans 1 mois #19019 par Evea
Bonjour à tous,

Je tiens d’abord à préciser que je ne suis pas très douée pour tout ce qui est scripting et programmation (voila qui aide :P ).

J’ai hésité à utiliser un autre sujet (récent) traitant également de fichier CSV, mais je me suis dit qu’il était mieux d'en ouvrir un tout neuf. J’espère ne pas me faire taper sur les doigts.

Alors voila. Je dois créer un script en powershell qui doit :

- Prendre un fichier en entrée
- Envoyer des mails aux différentes adresses mails contenues dans le fichier

Pour récupérer un fichier en entrée, voici mon code :

[code:1]### Choix du fichier à utiliser ###

$objForm = New-Object System.Windows.Forms.OpenFileDialog
$objForm.InitialDirectory = \"C:\Users\nom_user\Documents\"
$objForm.Title = \"Veuillez sélectionner un fichier...\"
$Show = $objForm.ShowDialog()

$fichier = Import-Csv $objForm.FileName
$fichier #vérification du contenu de la variable[/code:1]

Premier soucis : j’aimerais bien limiter la sélection du fichier au format CSV, mais je n’ai trouvé ça nulle part sur internet…

Ensuite : j’ai lu que « Import-CSV » permettait de créer un « tableau d’objets » . Je me suis dit que c’était cool, et que ça me permettrait de travailler plus simplement, notamment pour récupérer les infos que je veux… sauf que non.
En fait, je n’arrive qu’à travailler qu’avec les lignes, et pas les colonnes, ce qui ne m’arrange pas. Ou alors, c’est juste que je ne sais pas comment faire ce que je veux faire… :laugh:

Ce que j’aimerais, c’est « dire » à mon code : parcours le tableau, ligne 0 colonne 4, récupère l’élément, envoie un mail. Passe à la ligne suivante, ligne 1 colonne 4, récupère l’élément, envoie un mail, ainsi de suite, jusqu’au 50ème. Fait une pause. Puis tu continues avec les lignes suivantes (c’est une de mes contraintes pour ce script).

Sauf que je ne trouve pas du tout comment faire. Enfin, la seule indication que j’ai, c’est que je devrais utiliser une boucle for…

Du coup, ce que je me demande aussi, c’est comment faire pour récupérer les noms et les qualités (Monsieur, Madame, etc) pour les placer dans les mails (puisque les mails seront identiques pour toutes les adresses).

Je pensais faire un truc du genre

[code:1]$qualite $nom

# contenu du mail[/code:1]

Mais je suis opposée au même problème que pour la récupération des mails…

Je ne sais pas si je suis claire et/ou si ce que je souhaite faire est réalisable…

Merci d’avance à ceux qui pourront m’aider

Message édité par: Callypso, à: 11/02/15 16:57<br><br>Message édité par: Callypso, à: 11/02/15 16:57

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 1 mois #19021 par Philippe
salut Callypso

Je tiens d’abord à préciser que je ne suis pas très douée pour tout ce qui est scripting et programmation (voila qui aide ).

comme on dis ici : On a tous été débutant !

J’ai hésité à utiliser un autre sujet (récent) traitant également de fichier CSV, mais je me suis dit qu’il était mieux d'en ouvrir un tout neuf. J’espère ne pas me faire taper sur les doigts.

autre problème/autre situation donc autre sujet
en plus tu a plusieurs soucis ! :ohmy:

Premier soucis : j’aimerais bien limiter la sélection du fichier au format CSV, mais je n’ai trouvé ça nulle part sur internet…

sur la doc de OpenFileDialog regarde la doc du filtre
les code exemple sont pas du powershell mais tu compare une partie commune (par exemple InitialDirectory) tu va vite trouver !


pour import-csv :

En fait, je n’arrive qu’à travailler qu’avec les lignes, et pas les colonnes, ce qui ne m’arrange pas. Ou alors, c’est juste que je ne sais pas comment faire ce que je veux faire…

le probleme est le format du fichier csv
si tu la créé avec excel le délimiteur est le point-virgule donc
[code:1]$fichier = Import-Csv -Path Path\file.csv -Delimiter \&quot;;\&quot;[/code:1]

Du coup, ce que je me demande aussi, c’est comment faire pour récupérer les noms et les qualités (Monsieur, Madame, etc) pour les placer dans les mails (puisque les mails seront identiques pour toutes les adresses).

dans l'utilisation doit utilisé l'appellation tableau point propriété
exemple :
[code:1]$fichier.nom[/code:1]

voila fait nous un petit script que l'on regardera ensemble B)

Je ne sais pas si je suis claire et/ou si ce que je souhaite faire est réalisable…

claire : on n'a l'habitude :whistle:
réalisable : tous peut ce faire avec du temps :woohoo:<br><br>Message édité par: 6ratgus, à: 11/02/15 17:20

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 1 mois #19023 par Philippe

Ce que j’aimerais, c’est « dire » à mon code : parcours le tableau, ligne 0 colonne 4, récupère l’élément, envoie un mail. Passe à la ligne suivante, ligne 1 colonne 4, récupère l’élément, envoie un mail, ainsi de suite, jusqu’au 50ème. Fait une pause. Puis tu continues avec les lignes suivantes (c’est une de mes contraintes pour ce script).

il manque d'info sur les mails : a tu un serveur de mail ? snmp/imap ?


pour la boucle d'abord fait la boite de dialogue, ta qu'une ligne à rajouter
et la lecture du fichier ta un paramètre a rajouter

et on t'explique pour la boucle après

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 1 mois #19029 par Evea
Bonjour bonjour :)

Tout d'abord, merci pour tes premières indications, 6ratgus, qui m'ont été précieuses !

J'ai donc ajouté mon filtre pour les CSV, et le \&quot;-Delimiter\&quot;. En fait, lui, je l'avais déjà ajouté une fois, mais ça ne me donnait pas ce que je voulais comme résultat... bon, j'ai fini par me rendre compte que mon fichier CSV était mal foutu :p

Du coup, pour le moment, j'ai ça :

[code:1]### Choix du fichier à utiliser ###
### /!\ only CSV file ###

$objForm = New-Object System.Windows.Forms.OpenFileDialog
$objForm.InitialDirectory = \&quot;C:\Users\nom_user\Documents\&quot;
$objForm.Filter = \&quot;csv files (*.csv)|*.csv\&quot;
$objForm.Title = \&quot;Veuillez sélectionner un fichier...\&quot;
$Show = $objForm.ShowDialog()

$fichier = Import-Csv $objForm.FileName -Delimiter \&quot;;\&quot;
$fichier

[/code:1]

Qui me donne ça :

[code:1]Nom Prenom Qualite Mail
---

----
nom1 prenom1 madame Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
nom2 prenom2 mademoiselle Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
nom3 prenom3 monsieur Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.[/code:1]

C'est plutôt cool pour le moment (petit problème d'affichage ici, mais dans mon éditeur, l'affichage est nickel)

Ensuite, j'en arrive à ce point :

dans l'utilisation doit utilisé l'appellation tableau point propriété
exemple :
Code:

[code:1]$fichier.nom[/code:1]


Et je bloque toujours, puisque si j'écris très précisément cette même ligne, ça ne me donne rien du tout... :huh:
Enfin, ça ne me donne même pas le contenu de la colonne (je pensais que ça me l'afficherait l'intégralité des noms de la colonne, ou, des mails, si je mets \&quot;$fichier.mail\&quot;...)

il manque d'info sur les mails : a tu un serveur de mail ? snmp/imap ?


J'ai le nom du serveur SMTP.

En fait, je pense que la partie \&quot;envoi de mail\&quot; se construira comme ça (merci au site d'ailleurs :) ) :

[code:1]### Paramètres envoi du mail ###

$serveurSMTP = X.X.X.X
$mailTo = $fichier.mail
$mailFrom = Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
$pj = \&quot;C:\test.pdf\&quot;
$mailSubject = \&quot;Test\&quot;
$body = # le texte du mail sera contenu dans un fichier .doc ou .txt

$mail = New-Object System.Net.Mail.MailMessage $mailFrom, $mailTo, $mailSubject, $body
$attachment = new-object System.Net.Mail.Attachment $pj
$mail.Attachments.Add($pj)
$SMTPclient = new-object System.Net.Mail.SmtpClient $serveurSMTP
$SMTPclient.Credentials = [System.Net.CredentialCache]:: DefaultNetworkCredentials

### boucle parcours tableau + envoi mail ###

for (X1;X2;X3) {

$SMTPclient.Send($mail)
}
[/code:1]

J'ai un peu bon ou pas ? :/

Je pars un peu dans tous les sens, mais comme il y a des parties que je n'arrive pas à faire, alors je vais sur d'autres parties, que je pense pouvoir faire :unsure:

Message édité par: Callypso, à: 12/02/15 10:37

Message édité par: Callypso, à: 12/02/15 10:56

Message édité par: Callypso, à: 12/02/15 11:12<br><br>Message édité par: Callypso, à: 12/02/15 11:12

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 1 mois #19030 par Philippe

En fait, je pense que la partie \&quot;envoi de mail\&quot; se construira comme ça (merci au site d'ailleurs ) :

pour les mails si tu n'a pas de contrainte de version de powershell et que utilise au moins la version v2, je te conseil Send-MailMessage plus simple

exemple de microsoft :
[code:1]send-mailmessage -to \&quot;user01@example.com\&quot; -from \"User02 <user02@example.com&gt;\&quot; -subject \"Test mail\" -body \"Forgot to send the attachment. Sending now.\"[/code:1]


petite formation :

les tableaux (ici le $fichier) :
on peut accédé à chaque ligne d'un tableau avec les crochets [x]. un exemple :
[code:1]
$fichier[0]
# Donne :
#Nom Prenom Qualite Mail
#---

----
#nom1 prenom1 madame Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.

$fichier[2]
# Donne :
#Nom Prenom Qualite Mail
#---

----
#nom3 prenom3 monsieur Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
[/code:1]

pour un seul élément tu rajoute le nom de la propriété :
[code:1]$fichier[2].mail
# Donne :
#Mail
#----
#prenom3.nom3@mail.fr
[/code:1]

Pour la boucle :
en general on utilise les pipeline pour travaillé avec les objets et un tableau est un objet. Dans un pipeline chaque ligne de ton tableau est transféré dans la variable $_
cet exemple t'affiche tous les mails de ton fichier :
[code:1]
$fichier | foreach {
write-host $_.mail
}
[/code:1]
pour finir on rajoute l'envoie de mail :
[code:1]$serveurSMTP = X.X.X.X
$mailFrom = Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
$pj = \&quot;C:\test.pdf\&quot;
$mailSubject = \&quot;Test\&quot;

$fichier | foreach {
$body = \&quot;Bonjour $($_.Qualite) $($_.Nom) $($_.Prenom)`n`nForgot to send the attachment. `nSending now.\&quot;
$mailTo = $_.mail
send-mailmessage -to $mailTo -from $mailFrom -subject $mailSubject -body $body -Attachments $pj
}
[/code:1]

tu a des tutos sur laurent a fait qui sont tres bien
commence par l'introduction puis les Structures De Donnees et le reste ...<br><br>Message édité par: 6ratgus, à: 12/02/15 12:43

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 1 mois #19031 par Evea
Merci pour ton aide :)

Je suis en train de tout tester un à un.

Pour ce qui est de Send-MailMessage, je teste le code à part, et j'ai l'impression que ça ne fonctionne pas si je mets des variables en paramètres...

J'ai essayé ça (avec toutes les variables déclarées précédemment bien sur) :

[code:1]Send-MailMessage -to $mailTo -subject $mailSubject -body $body - SmtpServer $serveurSMTP -from $mailFrom -Attachments $pj[/code:1]

Ca n'a pas fonctionné.
je n'ai pas de message d'erreur (c'est déjà bien), mais je ne reçois aucun mail...

Edit : Fausse alerte, il fallait mettre les \&quot;\&quot;... je pensais qu'avec les variables, il ne fallait pas mettre les \&quot;\&quot; :)

Message édité par: Callypso, à: 12/02/15 15:05<br><br>Message édité par: Callypso, à: 12/02/15 15:08

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.057 secondes
Propulsé par Kunena