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 :

Equivalent GOTO vers Etiquette - SendMail destinataire multiple depuis variable [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Points : 45
    Points
    45
    Par défaut Equivalent GOTO vers Etiquette - SendMail destinataire multiple depuis variable
    Bonjour,

    Après moult recherche, je viens quérir vos connaissances avancées .

    J'ai créé un un script powershell qui permet de tester si un fichier reçu est une archive et si c'est le cas de le dézipper et d'envoyer un Mail.
    Le script fonctionne, mais j'aimerai éviter les redondance (de la ligne 34 à 61).



    Code : 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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    Param(
    [string]$Filename
    )
    
    # 0. fonction de ce script
    # 1. on test que l'on trouve bien la balise <?xml version="1.0" encoding="ISO-8859-1"?> dans le fichier
    # 2. si pas le cas, on déplace le zip dans le repertoire GZIP et on le decompresse dans le répertoire de travail
    
    cd C:\Script_Ps1
    $path = "c:\ftp\in\"
    $PathFilename = "$path$Filename"
    $SevenZip = "`"C:\Program Files\7-Zip\7z.exe`""
    
    $Expediteur = "tata@mail.com"
    
    $PathGzip = "c:\ftp\in\Gzip"
    $Gzippathfilename = "$PathGzip\$Filename"
    
    
    If (Test-Path $PathFilename) {
                $PthFilename = Get-ChildItem $path$Filename
                $SwiftFic = Get-Content ($PthFilename)
                foreach ($message in $SwiftFic) {
                    if ($message -match "<?xml version=") {
                        exit      
                                                }
                else {
                    Move-Item -Path $PathFilename -Destination $PathGzip 
                    $ungzip = "$SevenZip e $Gzippathfilename -o$path"
                    cmd.exe /c "$ungzip"
                    rename-item "$PathFilename~" -newname $Filename
                    
                   
                
                    if ($Filename -like "SWN-RUN*") {
                        $Sujet = "RUN : Traitement du Fichier compressé" 
                        $message = " 
    			                     <p>
    			                     Le fichier <SPAN style=color:#0000ff>$Filename </span>, nous a été transmis compressé. <br/>
    			                     Il a été traité par notre programme de reprise. <br/>
    								
    			                     </p>
    			                   " 
            
                        $Destinataire = "toto2<toto@mail.com>, toto2<toto2@mail.com>"        
                        .\SendMail.ps1 -sujet "$Sujet" -Message "$Message" -expediteur "$Expediteur" -Destinataire "$Destinataire" 
                                                }
            
                     if ($Filename -like "SWN-SGB*") {
                         $Sujet = "SGB : Traitement du Fichier compressé" 
                         $message = " 
    			                      <p>
    			                      Le fichier <SPAN style=color:#0000ff>$Filename </span>, nous a été transmis compressé. <br/>
    			                      Il a été traité par notre programme de reprise. <br/>
    							
    			                      </p>
    			                     " 
            
                          $Destinataire = "toto2<toto@mail.com>, toto2<toto2@mail.com>"      
                          .\SendMail.ps1 -sujet "$Sujet" -Message "$Message" -expediteur "$Expediteur" -Destinataire "$Destinataire" 
                                                   }
                                                                                                    
             exit       
                    }                                                        
                                                 }
    }
    Je pensais faire quelque chose comme ça :


    Code : 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
              
                    if ($Filename -like "SWN-RUN*") {goto Mail}
                    
                    if ($Filename -like "SWN-SGB*") {goto Mail}
                         
                                                   
                                                                                                    
                        exit       
                        }                                                        
                                                 }
    }
    
    :Mail
    
    $Sujet = "SGB : Traitement Fichier SWIFTNET compressé" 
    $message = " 
                 <p>
                 Le fichier <SPAN style=color:#0000ff>$Filename </span>, nous a été transmis compressé. <br/>
                 Il a été traité par notre programme de reprise. <br/>
    					
                 </p>
                " 
    $Destinataire = "toto2<toto@mail.com>, toto2<toto2@mail.com>"         
    .\SendMail.ps1 -sujet "$Sujet" -Message "$Message" -expediteur "$Expediteur" -Destinataire "$Destinataire"
    Je sais que GOTO n'existe pas en Powershell, mais il y a t'il un moyen d'aller vers une Etiquette ?
    J'ai voulu utiliser "BREAK Mail" mais a priori il faut l'associer à "WHILE"

    Le 2eme cas est l'envoi de destinataire multiple à partir d'une variable.
    $Destinataire = "toto2<toto@mail.com>, toto2<toto2@mail.com>"
    Seul la 1ere adresse est prise en compte.
    Pouvez-vous m'aider également sur ce point ?

    J’espère que ma demande n'est pas trop confuse.

    Yannick. (RAKHANN)

    Merci d'avance pour vos solutions.

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    pour le premier crée une fonction, le code fera tjr la même chose (un envoi de mail selon un critère), mais les paramètres changent à chaque appel.
    Il suffit de les recenser dans les parties de code dupliquées.

    Pour le second point tu utilises un script, vérifie si le paramètre -Expediteur attend un tableau ([string[]] $Expediteur).
    Ensuite tu procèdes comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     #crée un tableau
    $Expediteur=@(Email1,Email2)
    
    .\SendMail.ps1 -sujet "$Sujet" -Message "$Message" -expediteur $Expediteur -Destinataire "$Destinataire"
    En Powershell, le 'Goto' existe au sein d'une boucle, mais mieux vaut éviter ce type de code

  3. #3
    Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Points : 45
    Points
    45
    Par défaut
    Merci Laurent pour ta réponse,

    Je n'avais pas penser à faire une fonction.
    J'apprend sus le tas.

    J'en ai profiter également pour améliorer mon code, grâce à tes conseils et également sur le contrôle de l'archive.
    Maintenant, on test que l'archive est valide et si c'est le cas il dézippe.
    Du coup cela permet de traiter n'importe quelles archives .

    Code : 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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Param(
    [string]$Filename
    )
    
    # 0. fonction de ce script
    # 1. on test que l'archive est valide
    # 2. si c'est le cas, on déplace le zip dans le repertoire GZIP et on le decompresse dans le répertoire de travail
    
    $path = "c:\ftp\in\"
    $PathFilename = "$path$Filename"
    $DateTraitement = get-date -uformat %d%m%Y-%H%M%S
    $SevenZip = "`"C:\Program Files\7-Zip\7z.exe`""
    $PathGzip = "c:\ftp\in\Gzip"
    $Gzippathfilename = "$PathGzip\$Filename"
    
    
    function Mon_SendMail
    {Param ([string]$Site)
    $Expediteur = "exploitation@bfcoi.com"
    [STRING]$Destinataire = @("toto1<toto@bfcoi.com>", "toto2<toto@bfcoi.com>")
    $Sujet = "$Site : Traitement Fichier  compressé" 
    $message = " 
                 <p>
                 Le fichier <SPAN style=color:#0000ff>$Filename </span>, nous a été transmis compressé. <br/>
                 Il a été traité par notre programme de reprise. <br/>
    					
                 </p>
                "     
    #C:\Script_Ps1\SendMail.ps1 -sujet "$Sujet" -Message "$Message" -expediteur $Expediteur -Destinataire $Destinataire 
    C:\Script_Ps1\sendmail.ps1 -sujet "$Sujet" -Message "$Message" -expediteur $Expediteur -Destinataire $Destinataire 
    }
    
    function logSwn
    {Param ($Valeur)
    $logSwn = "log_swiftnet.txt"
    $result_file = "$path$logSwn"
    
    Add-Content -path $result_file -value "$valeur" -passthru
    }
    
    
    If (Test-Path $PathFilename) {
                cmd.exe /c "`"C:\Program Files\7-Zip\7z.exe`" t $path$filename"
                 
                if ( $LASTEXITCODE -ne 0 ) {
                        logSwn -valeur "Fichier $Filename OK $LASTEXITCODE --------- $DateTraitement"
                        exit      
                                                }
                else {
                    Move-Item -Path $PathFilename -Destination $PathGzip 
                    $ungzip = "$SevenZip e $Gzippathfilename -o$path"
                    cmd.exe /c "$ungzip"
                    rename-item "$PathFilename~" -newname $Filename
                    [string]$SbFilename = $Filename.substring(0,7)
                   
                    if ($Filename -like "SWN-RUN*") {
                                                    logSwn -valeur "Fichier $Filename en reprise ---------- $DateTraitement"
                                                    Mon_SendMail -Site "RUN"
                                                    }
                    
                    if ($Filename -like "SWN-SGB*") {
                                                    logSwn -valeur "Fichier $Filename en reprise ---------- $DateTraitement"
                                                    Mon_SendMail -Site "SGB"
                                                    }
                    
                                                                                                    
                    exit       
                                                                            
                                                 }
                                    }
    Pour le mail, je bosse encore dessus car toujours seul le 1er mail est pris en compte
    Pourtant dans mon script d'envoi mail, il me semble que c'est bon :
    SendMail.ps1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Param(
    [string]$Sujet,
    [string]$Message,
    [string[]]$Expediteur,
    [string]$Destinataire
    )
    
    
    $Body = "<p>Bonjour,<br/><br/>
            <span>$Message</span><br/><br/>
    
    </p>"  
            $encoding=[System.Text.Encoding]::UTF8        
            Send-MailMessage -From "$Expediteur" -to "$Destinataire" -subject "$Sujet" -SmtpServer "@IP" -BodyAsHtml $Body -Encoding $encoding
    Yannick. (RAKHANN)

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rakhann974 Voir le message
    Pourtant dans mon script d'envoi mail, il me semble que c'est bon :
    J'ai un doute sur la ligne d'appel suivante :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    Send-MailMessage -From "$Expediteur" -to "$Destinataire" -subject "$Sujet" -SmtpServer "@IP" -BodyAsHtml $Body -Encoding $encoding
    Les arguments étant déjà typé l'ajout de guillemets force une conversion et implique dans le cas de tableau la variable automatique $OFS (effet de bord).
    Un test :
    Code powershell : 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
     
    function Test {
        Param(
          [string[]]$Expediteur
       )
     
      $Expediteur.gettype()
     
      $Expediteur.Count
     
      $Expediteur[0].gettype()
     
     Write-host "Adresse mail 1: $($Expediteur[0])"
    }
    $ofs=''
    Test "$T"
    # 
    # IsPublic IsSerial Name                                     BaseType
    # -------- -------- ----                                     --------
    # True     True     String[]                                 System.Array
    # 1
    # True     True     String                                   System.Object
    # Adresse mail 1: email1@provider.comemail2@provider.com
     
    Test $T
    # 
    # IsPublic IsSerial Name                                     BaseType
    # -------- -------- ----                                     --------
    # True     True     String[]                                 System.Array
    # 2
    # True     True     String                                   System.Object
    # Adresse mail 1: email1@provider.com
    Le premier cas modifie le contenu du premier élément du tableau $Expéditeurs, je suppose qu'en interne l'API ne gère que la première adresse (il y a peut être une convention pour le séparateur...).

    Essaie ceci :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    Send-MailMessage -From $Expediteur -to $Destinataire -subject $Sujet -SmtpServer "@IP" -BodyAsHtml $Body  -Encoding $encoding

  5. #5
    Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Points : 45
    Points
    45
    Par défaut
    Bonjour Laurent,

    Je suis une buse

    Je n'avais pas placé mon [String[]] au bon endroit.
    Je l'avais mis sur le expéditeur au lieu du destinataire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Param(
    [string]$Sujet,
    [string]$Message,
    [string]$Expediteur,
    [string[]]$Destinataire
    )
    
    
    $Body = "<p>Bonjour,<br/><br/>
            <span>$Message</span><br/><br/>
    
    </p>"  
            $encoding=[System.Text.Encoding]::UTF8        
            Send-MailMessage -From "$Expediteur" -to "$Destinataire" -subject "$Sujet" -SmtpServer "@IP" -BodyAsHtml $Body -Encoding $encoding
    C'est beaucoup mieux.

    Merci beaucoup pour ton aide.

    J'espère que mon modeste code pourra servir à d'autre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 26/09/2011, 14h44
  2. Impression multiple depuis DOS
    Par mickael28 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 16/08/2008, 00h57
  3. Goto vers une procédure totalement lisible
    Par sechanbask dans le forum Général VBA
    Réponses: 10
    Dernier message: 06/06/2007, 18h22
  4. importation fichiers multiples depuis excel vers excel
    Par zougna dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/11/2006, 17h04
  5. Equivalence Goto en VBS
    Par lephyrexian dans le forum VBScript
    Réponses: 13
    Dernier message: 21/11/2006, 15h09

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