none
Variable qui ne se récupère pas dans une fonction RRS feed

  • Question

  • Bonjour,


    Je suis un peu coincé c'est pour cela que je demande votre aide. J'ai beau cherché sur google, les notions de scipting étant très éloigné, j'ai du mal.


    J'essaye via powershell d'archiver les mails plus vieux qu'une certaine date d'une boite Exchange vers un fichier PST (merci de lire jusqu'au bout svp avant de classer le post vers la partie Exchange du forum car je pense plutôt que mon soucis viens de ma mauvaise interprétation de powershell).

    Il semble que la variable comprenant la date n'est pas reprise dans une fonction. J'ai cru comprendre qu'il fallait mettre une variable global mais rien à faire.


    voici les commande que j'essaye de passer :

    $global:datearchivage=Get-Date (Get-Date).AddDays(-165) -format dd/MM/yyyy

    New-MailboxExportRequest -Mailbox $login -ContentFilter {(Received -le "$datearchivage")} -FilePath "\\monserveurdefichiers\ARCHIVES\MEssagerie\$login.pst"


    Cela ne fonctionne pas et quand je fais un echo de mon "New-MailboxExportRequest" je vois que la variable n'est pas prise en compte (comme si ce n'était pas une variable) :

    echo New-MailboxExportRequest -Mailbox $login -ContentFilter {(Received -le "$datearchivage")} -FilePath "\\monserveurdefichiers\ARCHIVES\MEssagerie\$login.pst"

    New-MailboxExportRequest-Mailbox

    -ContentFilter

    (Received -le "$datearchivage2")

    -FilePath

    \\monserveurdefichiers\ARCHIVES\MEssagerie\.pst


    Alors que cette variable aurait dû afficher la date suivante (comme vous pouvez le voir l'appel de cette variable me renvoie bien quelque chose):

    PS c\windows\system32> $datearchivage

    17/03/2016


    Sauriez vous ce qui coince svp ? afin que la date en variable soit bien prise en compte dans mon -ContentFilter{} svp ?

    Merci d'avance ;) !

    lundi 29 août 2016 14:31

Réponses

  • Je reviens ici avec quelque précision.
    J'ai pu faire des test sur un Exchange 2010 SP3 (version 14.3.123.2)

    Tu trouveras plus bas la syntaxe fonctionnelle à employer avec New-MailboxExportRequest 

    Mais, outre tes soucis de syntaxe, mes tests m'ont fait découvrir un comportement pour le moins bizzare de la cmdlet New-MailboxExportRequest , tu devrais les considérer aussi.

    Ce qui suit sont des constations réelles, je n'ai pas d'exchange plus récent pour tester.
    Ces test démontre un possible bug dans une cmdlet Exchange.


    Les boites mails sont au format fr-FR (tu peux vérifier les tiennes avec la commande Get-MailboxRegionalConfiguration)

    J'ai rencontré les même problèmes que toi, et j'en ai trouvé la cause (du moins dans mon cas, j'espère que cela sera le cas pour toi aussi)

    Dans la commande New-MailboxExportRequest  le paramètre -Contentfilter utilisé avec le champ Received accepte uniquement un date au format "MM/dd/yyyy" si elle est de type String.
    MAIS, la mailbox, si elle est en fr-FR, aura son champs Received en dd/MM/yyyy

    ET, et c'est là que ça se gâte, Get-MailboxRegionalConfiguration NE TRANSFORMERA PAS la date fournie dans le -Contentfilter.

    Tu suis?

    Exemples, pour être plus clair.

    • Contentfilter "Received -ge '20/01/2015'"
      Sera REFUSÉ par New-MailboxExportRequest
    • Contentfilter "Received -ge '01/20/2015'"
      sera accepté par New-MailboxExportRequest , MAIS l'export sera Failed car la date 01/20/2015 ne sera pas acceptée par le format date fr-FR de la mailbox.
    • Contentfilter "Received -ge '06/12/2015'"
      Sera accepté par New-MailboxExportRequest car date MM/dd/yyyy valide ==> 12 Juin 2015
      L'export se fera, avec la date tel quel lue comme dd/MM/yyyy, soit 6 décembre 2015

    Cette dernière étant fonctionnelle, mais foireuse au niveau des dates.

    Le paramètre -ContentFilterLanguage fr-FR n'y change rien

    La syntaxe:
    Voici les commande que l'ai utilisés, et qui fonctionnent:

    $datearchivage = get-date ((Get-Date).AddDays(-634)) -Format "dd/MM/yyy"
    $datearchivageEND = get-date ((Get-Date).AddDays(-608)) -Format "dd/MM/yyy"
    New-MailboxExportRequest -Mailbox "xx" -FilePath "\\SERVEUR\ExportPST\xx-AP.pst" -ContentFilter "Received -ge '$datearchivageEND'"
    New-MailboxExportRequest -Mailbox "xx" -FilePath "\\SERVEUR\ExportPST\xx-AV.pst" -ContentFilter "Received -le '$datearchivage'"
    New-MailboxExportRequest -Mailbox "xx" -FilePath "\\SERVEUR\ExportPST\xx-ENTRE.pst" -ContentFilter "(Received -le '$datearchivageEND') -and (Received -ge '$datearchivage')"
    
    

    Pourquoi cela fonctionne?

    La date du jour - 634 = 08/12/2014 ==> OK pour New-MailboxExportRequest et OK pour la Mailbox en fr-FR
    La date du jour - 608 = 03/01/2015 ==> OK pour New-MailboxExportRequest et OK pour la Mailbox en fr-FR

    J'espère que cela t'avancera, et si toi, et d'autre ici, pouviez faire quelque tests...

    B.

    • Marqué comme réponse shinobitom mercredi 14 septembre 2016 10:54
    vendredi 2 septembre 2016 12:57
  • Juste intuition et déduction.

    On trouve beaucoup de post sur la syntaxe de New-MailboxExportRequest et de son paramètre -ContentFilter
    Beaucoup de personne ont des erreurs ne savent pas spécialement pourquoi.

    L'analyse:

    • Contentfilter "Received -ge '20/01/2015'"
      Sera REFUSÉ par New-MailboxExportRequest
    • Contentfilter "Received -ge '01/20/2015'"
      sera accepté par New-MailboxExportRequest , MAIS l'export sera Failed car la date 01/20/2015 ne sera pas acceptée par le format date fr-FR de la mailbox.
    • Contentfilter "Received -ge '06/12/2015'"
      Sera accepté par New-MailboxExportRequest car date MM/dd/yyyy valide ==> 12 Juin 2015
      L'export se fera, avec la date tel quel lue comme dd/MM/yyyy, soit 6 décembre 2015

    je ne l'ai trouvé nul part, intuition, test et re-test, déduction.

    Pour ton cas, je te préconise ceci, qui ne générera pas d'erreur et te sera probablement suffisant.

    Pour ton export, il te faut t'adapter à cet état de fait.
    Je m'explique.

    Comme tu ne peux pas utiliser ce que tu veux comme date, on va faire en sorte que ta date de filtrage soit toujours compatible avec les format MM/dd/yyyy et dd/MM/yyyy

    comme ceci:

    $Date = (Get-Date).AddDays(-165)
    # on récupère l'année et le mois de la date d'archivage.
    $year = $Date.Year
    $Month = $("{0:00}" -f $Date.Month)
    # on construit une date string qui sera acceptée dans les deux formats MM/dd/yyyy et dd/MM/yyyy
    # et cette dtae string correspondras toujours, dans les deux formats, au mois et à l'anée choisie.
    # seul le jour sera modifié.
    $global:datearchivage = "$Month/$Month/$year"
    # et ensuite ton export
    New-MailboxExportRequest -Mailbox $login -ContentFilter "Received -le '$datearchivage'" -FilePath "\\monserveurdefichiers\ARCHIVES\MEssagerie\$login.pst"
    

    Le filtrage sera moins fin que celui que tu voulais, mais au moins, cela fonctionnera. En effet, tu n'auras que 12 possibilité de dd/MM:

    1/1
    2/2
    3/3
    4/4
    5/5
    6/6
    7/7
    8/8
    9/9
    10/10
    11/11
    12/12

    Mes ces douze possibilités offrent l'avantage d'être proche de ta date d'archivage et compatible tout format.
    6/6 sera toujours le 6 juin, dans les deux formats.

    en complément, tu peux refaire une variable de type [datetime] pour d'autre action dans ton script, si besoin:

    $DateArch = [datetime]::ParseExact($datearchivage,”dd/MM/yyyy”,$null)
    ce qui te donnera une variable $DateArch de type [DateTime]

    Voilà, t'as de la matière

    B.

    • Marqué comme réponse shinobitom mercredi 14 septembre 2016 10:54
    samedi 10 septembre 2016 09:14
  • Re,

    Du coup je me suis débrouillé pour prévoir un problème d'archivage et éviter de lancer la suppression des mails non archivés.

    Je poste ici le script final (enfin final il y a moyen de le raccourcir, de l'optimiser et de faire quelque chose de plus propre mais déjà ce que je voulais faire marche), bon après je débute.

    Pour info les nombreux write-host c'était pour rendre le script verbeux afin de me dépanner, savoir pourquoi je n'avais pas de comportement normal. Le top à l'avenir sera plutôt d'écrire les infos dans un fichier de log car ce script est destiné à être lancé via planificateur de tâche donc on sera pas forcément devant pour voir les write host.

    N'hésitez pas si vous avez des remarques :

    ################################################################## Appel des commandes Exchange ##################################################################
    
    Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
    
    
    ################################################################## Définitions des variables ##################################################################
    
    $Date = (Get-Date).AddDays(-165)
    $year = $Date.Year
    $Month = $("{0:00}" -f $Date.Month)
    $global:datearchivage = "$Month/$Month/$year"
    
    write-host "#####################TEST des variables###################"
    write-host "les mail plus vieux que $datearchivage seront archivés"
    
    
    ################################################################## Récupération des boites à Archiver sur l'AD ##################################################################
    
    write-host "#####################Récupération des boites à Archiver sur l'AD#####################"
    
    #récupération des boites dont l'utilisateur correspondant se trouve une OU particulière de l'AD
    Get-Mailbox | Where-Object{$_.OrganizationalUnit -eq "domaine.fr/TESTS/archivageauto"} | foreach {
    
    #récupération du nom et du login de l'utilisateur correspondant à la boite en cours de traitement
    	$nom=$_.Name	
    	$login=$_.SamAccountName
    
        write-host "début de traitement pour $nom"
    
    
    ################################################################## Archivage ##################################################################
    
    write-host "################################# Archivage de la boite de $nom des mails plus vieux que $datearchivage #################################"
    
    write-host "vérification de l'emplacement du PST : \\FS\ARCHIVES\MEssagerie\$login.pst"
    
    #Les exports précédent de la boite en cours de traitement, si il y en a, seront supprimés sinon les mails seront supprimés sans être archivé (voir plus loin pour comprendre)
    Get-MailboxExportRequest -Mailbox $login | Remove-MailboxExportRequest -Confirm:$false
    
    #Export de la boite sans les contacts ni les éléments récupérables
    New-MailboxExportRequest -Mailbox $login -ContentFilter "Received -le '$datearchivage'" -FilePath "\\FS\ARCHIVES\MEssagerie\$login.pst" -ExcludeFolders "#Contacts#" -ExcludeDumpster
    	#Je vérifie que l'export est bien terminé avant de lancer la suppression (qu'il soit complété ou échoué... - la suite après la boucle)
        $exportrequest=Get-MailboxExportRequest -Mailbox $login
        Write-Host "Statut de l'ExportRequest : "$exportrequest.Status
        while(!((Get-MailboxExportRequest -Mailbox $login -status "Completed") -or (Get-MailboxExportRequest -Mailbox $login -status "Failed") -or ($exportrequest -eq $null) ) ){
            #Des fois l'export reste en Queued et ne se lance pas, pour éviter d'être planté je force le traitement de l'export :
            while($exportrequest.Status -eq "Queued"){
                Get-MailboxExportRequest -Mailbox $login | Resume-MailboxExportRequest
                write-host "Lancement du processus d'archivage"
                Start-Sleep -s 3
                $exportrequest=Get-MailboxExportRequest -Mailbox $login
                Write-Host "Statut de l'ExportRequest : "$exportrequest.Status
            }
    	    write-host "archivage de la boite de $nom en cours"
            Start-Sleep -s 3
            $exportrequest=Get-MailboxExportRequest -Mailbox $login
            Write-Host "Statut de l'ExportRequest : "$exportrequest.Status
        }
    
        #Si l'archivage a réussi, je lance la suppression
        if ($exportrequest.Status -eq "Completed"){
    
            # Je nettoye la requête d'export maintenant que c'est terminé
            Get-MailboxExportRequest -Mailbox $login | Remove-MailboxExportRequest -Confirm:$false
            write-host "Archivage de la BAL de $nom termine"
    
            ################################################################## Suppression ##################################################################
    
            write-host "################################# Suppression des mails de la boite de $nom plus vieux que $datearchivage #################################"
    
            #Recherche et suppression des mails uniquement selon la date choisie
            Search-Mailbox -identity $login -SearchQuery "Received<$datearchivage AND kind:email" -DeleteContent -Force
    
            #Le jour où vous on souhaite juste vérifier qu'il y a un résultat sans supprimer pour tester:
            #Search-Mailbox -identity $login -SearchQuery "Received<$datearchivage AND kind:email" -EstimateResultOnly
    
            write-host "Supression des mails de la boite de $nom termine"
            write-host "Archivage de la BAL de $nom termine"
    
            write-host "############################### fin de traitement pour $nom ####################"
        }
    
        # Sinon on passe à la boite suivante
        else{
        write-host "L'archivage n'a pas fonctionné"
        }
        
    write-host "Traitement de la boite suivante dans l'OU"
    }
    
    

    J'éspère que ça aidera du monde.

    Bonne journée

    • Marqué comme réponse shinobitom mercredi 14 septembre 2016 10:54
    mercredi 14 septembre 2016 10:53

Toutes les réponses

  • Hello,

    Cela vient sans doute des paramètres régionaux. Essaie d'inverser JJ & MM => $datearchivage = 03/17/2016


    Please “Vote As Helpful” and/or “Mark As Answer” if this post helped you. Thanks! Disclaimer: This posting is provided AS IS with no warranties or guarantees and confers no rights.

    lundi 29 août 2016 14:50
  • Merci Xuan,


    Le fait de d'inverser jour et mois ne change rien au soucis. En fait le problème c'est qu'au lieu de traduire ma variable au format date, il ne la traduit pas,  il fait comme si ce n'était pas une variable et affiche son nom en texte.


    Je ne sais pas si je suis clair.


    En gros pour résumé :


    Au lieu que le système reçoive la commande :

    New-MailboxExportRequest -Mailbox $login -ContentFilter {(Received -le "17/03/2016")}

    il reçoit :

    New-MailboxExportRequest -Mailbox $login -ContentFilter {(Received -le "$datearchivage")}

    La variable n'est pas appelé, pour lui c'est du texte, ou une variable qui n'existe pas alors que je l'ai instancié au début de mon script...

    Et là en gros il me dit : Je ne comprends pas le texte "$datearchivage", je suis censé recevoir une date.

    lundi 29 août 2016 15:02
  • Et là en gros il me dit : Je ne comprends pas le texte "$datearchivage", je suis censé recevoir une date.

    Salut shinobitom

    a tu fait un essai sans les guillemets ?

    New-MailboxExportRequest -Mailbox $login -ContentFilter {(Received -le $datearchivage)}

    lundi 29 août 2016 15:27
  • Merci 6ratgus,

    Mais ça ne marche pas non plus. Il ne récupère toujours pas la valeur.

    J'ai fait plusieurs tests et il s'avère que à partir du moment où je mets ma variable entre les {} la valeur n'est pas récupérée.

    par exemple

    New-MailboxExportRequest -Mailbox $login -ContentFilter "Received -le $datearchivage"

    là la variable est bien récupérée. Le système voit bien la directive :

    New-MailboxExportRequest -Mailbox $login -ContentFilter "Received -le 03/17/2016"

    Le problème c'est que j'ai une autre erreur du coup car le système attend forcément les {} après le -contentfilter.

    Par contre  si je fait

    New-MailboxExportRequest -Mailbox $login -ContentFilter {Received -le $datearchivage}

    La valeure de la variable n'est pas récupérée. Le système voit la directive :

    New-MailboxExportRequest -Mailbox $login -ContentFilter {Received -le $datearchivage}

    Snifff je ne comprend pas. Je ne sais pas si je suis clair.

    Merci d'avance à celui qui me sortira de là...

    lundi 29 août 2016 16:26
  • plusieur problèmes.

    Quand Powershell veut comparer deux valeurs, celle-ci doivent  avoir le même format, et ce n'est pas le cas ici.

    Ta variable $datearchivage tel que tu l'alimente est de type String.
    Et ton filtre attend une variable de type DateTime.

    Alors, plusieurs solution s'offre à toi

    force le format DateTime dans ton assignation de variable:

    $global:datearchivage= [datetime](Get-Date (Get-Date).AddDays(-165) -format dd/MM/yyyy)

    Mais tu remarquera que cette commande donne une erreur chaque fois que le jour ser égal ou supérieur à 13,
    Car [datetime] n'acceptera une String que sous le format MM/dd/yyy
    Alors que celle-ci:

    $global:datearchivage= [datetime](Get-Date (Get-Date).AddDays(-165) -format MM/dd/yyyy)

    te donnera bien le bon format comme le prouve la méthode GetType()


    Tu peux aussi, et plus simplement, te passer de transformer le résultat de Get-date en String, pour le remettre ensuite en DateTime, comme ceci:

    $global:datearchivage= (Get-Date).AddDays(-165)
    Un peu plus simple que tes appels successifs de Get-date, non

    Après cela, il faut peut être forcer le développement de la variable dans la commande, comme ceci:

    New-MailboxExportRequest -Mailbox $login -ContentFilter {Received -le $($datearchivage)}

    Mais cela, je ne sais pas tester, je n'ai pas d'exchange sous la mains.

    ++

    Alain

    lundi 29 août 2016 17:16
  • Merci Alain pour ta réponse précise


    j'ai essayé ce que tu m'as demandé mais :

    1. Quand j'instancie la variable en forçant le type datetime, il ne me mets pas la date au bon format malgré la directive :

    PS C:\Users\administrateur> $global:datearchivage= [datetime](Get-Date (Get-Date).AddDays(-165) -f MM/dd/yyyy

    PS C:\Users\administrateur> $datearchivage

    vendredi 18 mars 2016 00:00:00

    le probème c'est que la commande ne s'exécute correctement que si j'ai la date au format MM/dd/yyyy


    2. Quand bien même, la variable n'est toujours pas traduite malgré, comme tu me le suggérais, en forçant le développement de la variable. Il voit la variable comme si ce n'était pas une variable :


    PS C:\Users\administrateur> New-MailboxExportRequest -Mailbox $login -ContentFilter {Received -le $($datearchivage)}

    La valeur ContentFilter fournie n'est pas valide. ContentFilter n'est pas valide. Syntaxe de filtre non valide. Pour
    obtenir une description de la syntaxe du paramètre de filtre, consultez l'aide de la commande.
    « Received -le $($datearchivage) » en position 15. --> Syntaxe de filtre non valide. Pour obtenir une description de
    la syntaxe du paramètre de filtre, consultez l'aide de la commande.
    « Received -le $($datearchivage) » en position 15.
    Au caractère C:\script\archivageauto.ps1:19 : 2
    +     New-MailboxExportRequest -Mailbox $login -ContentFilter {Received -le $($datear ...
    +    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument : (Received -le $($datearchivage):String) [], ContentFilterInvalidPerman
       entException
        + FullyQualifiedErrorId : [Server=G-MESSAGERIE-01,RequestId=3da4583f-d05f-4767-86f7-5cfa00f9971f,TimeStamp=30/08/2
       016 16:04:31] [FailureCategory=Cmdlet-ContentFilterInvalidPermanentException] 2DBD15C9


    C'est vraiment bizarre. Malheureusment je ne suis pas expert en dev, là c'est assez exceptionelle que j'y touche...

    Les variables peuvent elles s'effacer entre des fonction ? se réinitialiser ? Comment empêcher cela ?


    merci d'avance,





    mardi 30 août 2016 16:16
  • Je reviens ici avec quelque précision.
    J'ai pu faire des test sur un Exchange 2010 SP3 (version 14.3.123.2)

    Tu trouveras plus bas la syntaxe fonctionnelle à employer avec New-MailboxExportRequest 

    Mais, outre tes soucis de syntaxe, mes tests m'ont fait découvrir un comportement pour le moins bizzare de la cmdlet New-MailboxExportRequest , tu devrais les considérer aussi.

    Ce qui suit sont des constations réelles, je n'ai pas d'exchange plus récent pour tester.
    Ces test démontre un possible bug dans une cmdlet Exchange.


    Les boites mails sont au format fr-FR (tu peux vérifier les tiennes avec la commande Get-MailboxRegionalConfiguration)

    J'ai rencontré les même problèmes que toi, et j'en ai trouvé la cause (du moins dans mon cas, j'espère que cela sera le cas pour toi aussi)

    Dans la commande New-MailboxExportRequest  le paramètre -Contentfilter utilisé avec le champ Received accepte uniquement un date au format "MM/dd/yyyy" si elle est de type String.
    MAIS, la mailbox, si elle est en fr-FR, aura son champs Received en dd/MM/yyyy

    ET, et c'est là que ça se gâte, Get-MailboxRegionalConfiguration NE TRANSFORMERA PAS la date fournie dans le -Contentfilter.

    Tu suis?

    Exemples, pour être plus clair.

    • Contentfilter "Received -ge '20/01/2015'"
      Sera REFUSÉ par New-MailboxExportRequest
    • Contentfilter "Received -ge '01/20/2015'"
      sera accepté par New-MailboxExportRequest , MAIS l'export sera Failed car la date 01/20/2015 ne sera pas acceptée par le format date fr-FR de la mailbox.
    • Contentfilter "Received -ge '06/12/2015'"
      Sera accepté par New-MailboxExportRequest car date MM/dd/yyyy valide ==> 12 Juin 2015
      L'export se fera, avec la date tel quel lue comme dd/MM/yyyy, soit 6 décembre 2015

    Cette dernière étant fonctionnelle, mais foireuse au niveau des dates.

    Le paramètre -ContentFilterLanguage fr-FR n'y change rien

    La syntaxe:
    Voici les commande que l'ai utilisés, et qui fonctionnent:

    $datearchivage = get-date ((Get-Date).AddDays(-634)) -Format "dd/MM/yyy"
    $datearchivageEND = get-date ((Get-Date).AddDays(-608)) -Format "dd/MM/yyy"
    New-MailboxExportRequest -Mailbox "xx" -FilePath "\\SERVEUR\ExportPST\xx-AP.pst" -ContentFilter "Received -ge '$datearchivageEND'"
    New-MailboxExportRequest -Mailbox "xx" -FilePath "\\SERVEUR\ExportPST\xx-AV.pst" -ContentFilter "Received -le '$datearchivage'"
    New-MailboxExportRequest -Mailbox "xx" -FilePath "\\SERVEUR\ExportPST\xx-ENTRE.pst" -ContentFilter "(Received -le '$datearchivageEND') -and (Received -ge '$datearchivage')"
    
    

    Pourquoi cela fonctionne?

    La date du jour - 634 = 08/12/2014 ==> OK pour New-MailboxExportRequest et OK pour la Mailbox en fr-FR
    La date du jour - 608 = 03/01/2015 ==> OK pour New-MailboxExportRequest et OK pour la Mailbox en fr-FR

    J'espère que cela t'avancera, et si toi, et d'autre ici, pouviez faire quelque tests...

    B.

    • Marqué comme réponse shinobitom mercredi 14 septembre 2016 10:54
    vendredi 2 septembre 2016 12:57
  • Bonjour et merci Bawilanemo.

    Désolé de ne pas avoir pu te répondre avant j'ai été mis temporairement sur d'autres problèmes un peu critique donc je n'ai pas eu le temps de revenir sur le forum.

    Je n'ai pas encore pu testé, cette réponse c'est surtout par respect pour la personne qui m'aide et qui a fait des recherches ;)

    Je vais essayer de tester rapidement pour te tenir informé des résultats.

    Bonne journée,

    vendredi 9 septembre 2016 13:40
  • J'ai testé ta méthode et déjà grand merci, le format de ta commande notamment ceci me permet d'aller plus loin :

     -ContentFilter "Received -le '$datearchivage'" => je n'avais pas mis les simples quote :)

    J'ai testé sous Exchange 2013 et j'ai effectivement le même bug que toi.

    C'est très bien de jouer avec les dates, sauf que quand c'est des jours plus grand que 12 (du 13 au 31 Juillet par exemple), ça foire.


    Je vais essayer de jouer avec les paramètres régionaux serveur + boite.

    Je me suis amusé avec la commande

    set-MailboxRegionalConfiguration maboite -language en-US -DateFormat MM/dd/yyyy

    Pour l'instant sans résultat mais je vais continuer les investigations.

    En tout cas bravo pour avoir trouvé ça !

    Du coup ça m'intéresse, quand tu dis :

    Dans la commande New-MailboxExportRequest  le paramètre 
    -Contentfilter utilisé avec le champ Received accepte uniquement un date au format "MM/dd/yyyy" si elle est de type String.
    MAIS, la mailbox, si elle est en fr-FR, aura son champs Received en dd/MM/yyyy

    C'est par intuition et déduction ou c'est vraiment écrit quelque part, dans une propriété d'un objet notemment que le champ Received est en dd/MM/yyyy ?

    Bonne journée,

    vendredi 9 septembre 2016 16:01
  • Juste intuition et déduction.

    On trouve beaucoup de post sur la syntaxe de New-MailboxExportRequest et de son paramètre -ContentFilter
    Beaucoup de personne ont des erreurs ne savent pas spécialement pourquoi.

    L'analyse:

    • Contentfilter "Received -ge '20/01/2015'"
      Sera REFUSÉ par New-MailboxExportRequest
    • Contentfilter "Received -ge '01/20/2015'"
      sera accepté par New-MailboxExportRequest , MAIS l'export sera Failed car la date 01/20/2015 ne sera pas acceptée par le format date fr-FR de la mailbox.
    • Contentfilter "Received -ge '06/12/2015'"
      Sera accepté par New-MailboxExportRequest car date MM/dd/yyyy valide ==> 12 Juin 2015
      L'export se fera, avec la date tel quel lue comme dd/MM/yyyy, soit 6 décembre 2015

    je ne l'ai trouvé nul part, intuition, test et re-test, déduction.

    Pour ton cas, je te préconise ceci, qui ne générera pas d'erreur et te sera probablement suffisant.

    Pour ton export, il te faut t'adapter à cet état de fait.
    Je m'explique.

    Comme tu ne peux pas utiliser ce que tu veux comme date, on va faire en sorte que ta date de filtrage soit toujours compatible avec les format MM/dd/yyyy et dd/MM/yyyy

    comme ceci:

    $Date = (Get-Date).AddDays(-165)
    # on récupère l'année et le mois de la date d'archivage.
    $year = $Date.Year
    $Month = $("{0:00}" -f $Date.Month)
    # on construit une date string qui sera acceptée dans les deux formats MM/dd/yyyy et dd/MM/yyyy
    # et cette dtae string correspondras toujours, dans les deux formats, au mois et à l'anée choisie.
    # seul le jour sera modifié.
    $global:datearchivage = "$Month/$Month/$year"
    # et ensuite ton export
    New-MailboxExportRequest -Mailbox $login -ContentFilter "Received -le '$datearchivage'" -FilePath "\\monserveurdefichiers\ARCHIVES\MEssagerie\$login.pst"
    

    Le filtrage sera moins fin que celui que tu voulais, mais au moins, cela fonctionnera. En effet, tu n'auras que 12 possibilité de dd/MM:

    1/1
    2/2
    3/3
    4/4
    5/5
    6/6
    7/7
    8/8
    9/9
    10/10
    11/11
    12/12

    Mes ces douze possibilités offrent l'avantage d'être proche de ta date d'archivage et compatible tout format.
    6/6 sera toujours le 6 juin, dans les deux formats.

    en complément, tu peux refaire une variable de type [datetime] pour d'autre action dans ton script, si besoin:

    $DateArch = [datetime]::ParseExact($datearchivage,”dd/MM/yyyy”,$null)
    ce qui te donnera une variable $DateArch de type [DateTime]

    Voilà, t'as de la matière

    B.

    • Marqué comme réponse shinobitom mercredi 14 septembre 2016 10:54
    samedi 10 septembre 2016 09:14
  • Excelleeeeent !!!! ;)

    Un truc simple qui peut sauver la vie auquel je n'avais pas pensé ;)

    Il est clair que cela correspond à mon besoin car je n'aurais pas besoin d'archiver toutes les boites tous les jours ;) Une fois par mois ça suffit dans mon cas de figure.

    Je teste mardi ou mercredi et te tiens au jus ;)

    Si ça marche je posterais mon script entier qui contient aussi une deuxième partie qui supprime les mails archivés (ça j'ai réussi à le faire marcher), ce qui aidera du monde j'en suis certain.

    En tout cas merci !

    lundi 12 septembre 2016 15:04
  • Merci bien Bawilanemo ça marche impeccable !

    Voici ci dessous mon script complet en espérant que cela aide du monde, autant qu'on m'a aidé.

    Par rapport à ce script j'ai juste une dernière question, vous pouvez voir en dessous que je teste si le statut de status de l'export n'est pas Completed. Comment faire pour dire Completed ou Failed svp ?

    Voici la ligne de commande:

    while(!(Get-MailboxExportRequest -Mailbox $login -Status "Completed")){

    Dès que j'aurais la réponse je mettrais ce sujet comme clos et je sélectionnerais les réponses qui m'ont aidé. merci d'avance

    Voici le script ci dessous qui permet de rechercher des boites en passant par l'AD, archiver depuis une certaine date et supprimer les mails archivés. Beaucoup me diront que dans Exchange 2013 il y a des balises et stratégie de rétention, sauf que de mémoire il faut acheter les licences avancées, ce qui pour mon client n'est pas possible niveau budget.

    Aussi je rappelle que je suis néophyte en Powershell, c'est extrêmement rare que j'y touche. Donc vous allez surement trouver des choses vraiment crade niveau développement. Si vous avez des remarques à ce niveau n'hésitez pas ;) je ne désire qu'apprendre.

    ################################################################## Appel des commandes Exchange ##################################################################
    
    Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
    
    
    ################################################################## Définitions des variables ##################################################################
    
    $Date = (Get-Date).AddDays(-165)
    $year = $Date.Year
    $Month = $("{0:00}" -f $Date.Month)
    $global:datearchivage = "$Month/$Month/$year"
    
    write-host "#####################TEST des variables###################"
    write-host "les mail plus vieux que $datearchivage seront archivés"
    
    
    ################################################################## Récupération des boites à Archiver sur l'AD ##################################################################
    
    write-host "#####################Récupération des boites à Archiver sur l'AD#####################"
    
    #récupération des boites dont l'utilisateur correspondant se trouve une OU particulière de l'AD
    Get-Mailbox | Where-Object{$_.OrganizationalUnit -eq "domaine.fr/TESTS/archivageauto"} | foreach {
    
    #récupération du nom et du login de l'utilisateur correspondant à la boite en cours de traitement
    	$nom=$_.Name	
    	$login=$_.SamAccountName
    
        write-host "début de traitement pour $nom"
    
    
    ################################################################## Archivage ##################################################################
    
    write-host "################################# Archivage de la boite de $nom des mails plus vieux que $datearchivage #################################"
    
    write-host "vérification de l'emplacement du PST : \\FS\ARCHIVES\MEssagerie\$login.pst"
    
    #Les exports précédent de la boite en cours de traitement, si il y en a, seront supprimés sinon les mails seront supprimés sans être archivé (voir plus loin pour comprendre)
    Get-MailboxExportRequest -Mailbox $login | Remove-MailboxExportRequest -Confirm:$false
    
    #Export de la boite sans les contacts ni les éléments récupérables
    New-MailboxExportRequest -Mailbox $login -ContentFilter "Received -le '$datearchivage'" -FilePath "\\g-fs-01\ARCHIVES\MEssagerie\$login.pst" -ExcludeFolders "#Contacts#" -ExcludeDumpster
    	#Je vérifie que l'export est bien terminé avant de lancer la suppression...
        while(!(Get-MailboxExportRequest -Mailbox $login -Status "Completed")){
            #Des fois l'export reste en Queued et ne se lance pas, pour éviter d'être planté je force le traitement de l'export :
            while(Get-MailboxExportRequest -Mailbox $login -Status "Queued"){
                Get-MailboxExportRequest -Mailbox $login | Resume-MailboxExportRequest
                write-host "Lancement du processus d'archivage"
                Start-Sleep -s 3
            }
    	    write-host "archivage de la boite de $nom en cours"
            Start-Sleep -s 3
        }
    write-host "Archivage de la BAL de $nom termine"
    
    # Je nettoye la requête d'export maintenant que c'est terminé
    Get-MailboxExportRequest -Mailbox $login | Remove-MailboxExportRequest -Confirm:$false
    
    
    ################################################################## Suppression ##################################################################
    
    write-host "################################# Suppression des mails de la boite de $nom plus vieux que $datearchivage #################################"
    
    #Recherche et suppression des mails uniquement selon la date choisie
    Search-Mailbox -identity $login -SearchQuery "Received<$datearchivage AND kind:email" -DeleteContent -Force
    
    #Le jour où vous on souhaite juste vérifier qu'il y a un résultat sans supprimer pour tester:
    #Search-Mailbox -identity $login -SearchQuery "Received<$datearchivage AND kind:email" -EstimateResultOnly
    
    write-host "Supression des mails de la boite de $nom termine"
    
    
    ################################################################## Message de fin ##################################################################
    write-host "############################### fin de traitement pour $nom ####################"
    
    #Et c'est parti pour les autres boites de l'OU
    }
    
    

    Bonne journée
    mardi 13 septembre 2016 15:53
  • Re,

    Du coup je me suis débrouillé pour prévoir un problème d'archivage et éviter de lancer la suppression des mails non archivés.

    Je poste ici le script final (enfin final il y a moyen de le raccourcir, de l'optimiser et de faire quelque chose de plus propre mais déjà ce que je voulais faire marche), bon après je débute.

    Pour info les nombreux write-host c'était pour rendre le script verbeux afin de me dépanner, savoir pourquoi je n'avais pas de comportement normal. Le top à l'avenir sera plutôt d'écrire les infos dans un fichier de log car ce script est destiné à être lancé via planificateur de tâche donc on sera pas forcément devant pour voir les write host.

    N'hésitez pas si vous avez des remarques :

    ################################################################## Appel des commandes Exchange ##################################################################
    
    Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
    
    
    ################################################################## Définitions des variables ##################################################################
    
    $Date = (Get-Date).AddDays(-165)
    $year = $Date.Year
    $Month = $("{0:00}" -f $Date.Month)
    $global:datearchivage = "$Month/$Month/$year"
    
    write-host "#####################TEST des variables###################"
    write-host "les mail plus vieux que $datearchivage seront archivés"
    
    
    ################################################################## Récupération des boites à Archiver sur l'AD ##################################################################
    
    write-host "#####################Récupération des boites à Archiver sur l'AD#####################"
    
    #récupération des boites dont l'utilisateur correspondant se trouve une OU particulière de l'AD
    Get-Mailbox | Where-Object{$_.OrganizationalUnit -eq "domaine.fr/TESTS/archivageauto"} | foreach {
    
    #récupération du nom et du login de l'utilisateur correspondant à la boite en cours de traitement
    	$nom=$_.Name	
    	$login=$_.SamAccountName
    
        write-host "début de traitement pour $nom"
    
    
    ################################################################## Archivage ##################################################################
    
    write-host "################################# Archivage de la boite de $nom des mails plus vieux que $datearchivage #################################"
    
    write-host "vérification de l'emplacement du PST : \\FS\ARCHIVES\MEssagerie\$login.pst"
    
    #Les exports précédent de la boite en cours de traitement, si il y en a, seront supprimés sinon les mails seront supprimés sans être archivé (voir plus loin pour comprendre)
    Get-MailboxExportRequest -Mailbox $login | Remove-MailboxExportRequest -Confirm:$false
    
    #Export de la boite sans les contacts ni les éléments récupérables
    New-MailboxExportRequest -Mailbox $login -ContentFilter "Received -le '$datearchivage'" -FilePath "\\FS\ARCHIVES\MEssagerie\$login.pst" -ExcludeFolders "#Contacts#" -ExcludeDumpster
    	#Je vérifie que l'export est bien terminé avant de lancer la suppression (qu'il soit complété ou échoué... - la suite après la boucle)
        $exportrequest=Get-MailboxExportRequest -Mailbox $login
        Write-Host "Statut de l'ExportRequest : "$exportrequest.Status
        while(!((Get-MailboxExportRequest -Mailbox $login -status "Completed") -or (Get-MailboxExportRequest -Mailbox $login -status "Failed") -or ($exportrequest -eq $null) ) ){
            #Des fois l'export reste en Queued et ne se lance pas, pour éviter d'être planté je force le traitement de l'export :
            while($exportrequest.Status -eq "Queued"){
                Get-MailboxExportRequest -Mailbox $login | Resume-MailboxExportRequest
                write-host "Lancement du processus d'archivage"
                Start-Sleep -s 3
                $exportrequest=Get-MailboxExportRequest -Mailbox $login
                Write-Host "Statut de l'ExportRequest : "$exportrequest.Status
            }
    	    write-host "archivage de la boite de $nom en cours"
            Start-Sleep -s 3
            $exportrequest=Get-MailboxExportRequest -Mailbox $login
            Write-Host "Statut de l'ExportRequest : "$exportrequest.Status
        }
    
        #Si l'archivage a réussi, je lance la suppression
        if ($exportrequest.Status -eq "Completed"){
    
            # Je nettoye la requête d'export maintenant que c'est terminé
            Get-MailboxExportRequest -Mailbox $login | Remove-MailboxExportRequest -Confirm:$false
            write-host "Archivage de la BAL de $nom termine"
    
            ################################################################## Suppression ##################################################################
    
            write-host "################################# Suppression des mails de la boite de $nom plus vieux que $datearchivage #################################"
    
            #Recherche et suppression des mails uniquement selon la date choisie
            Search-Mailbox -identity $login -SearchQuery "Received<$datearchivage AND kind:email" -DeleteContent -Force
    
            #Le jour où vous on souhaite juste vérifier qu'il y a un résultat sans supprimer pour tester:
            #Search-Mailbox -identity $login -SearchQuery "Received<$datearchivage AND kind:email" -EstimateResultOnly
    
            write-host "Supression des mails de la boite de $nom termine"
            write-host "Archivage de la BAL de $nom termine"
    
            write-host "############################### fin de traitement pour $nom ####################"
        }
    
        # Sinon on passe à la boite suivante
        else{
        write-host "L'archivage n'a pas fonctionné"
        }
        
    write-host "Traitement de la boite suivante dans l'OU"
    }
    
    

    J'éspère que ça aidera du monde.

    Bonne journée

    • Marqué comme réponse shinobitom mercredi 14 septembre 2016 10:54
    mercredi 14 septembre 2016 10:53
  • désolé du retard, fort occupé!

    Pour ton script, ce que je hangerais:

    • Charger la liste des mailbox dans une variable
    • foreach sur la variable.
    • log

    comme cela, tu sauras gérer les failed, en sortant de la boucle foreach avec la commande CONTINUE

    comme ceci (non testé, j'ai pas d'exchange sous la main)

    ################################################################## Appel des commandes Exchange ##################################################################
    Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
    ################################################################## Définitions des variables ##################################################################
    
    $Date = (Get-Date).AddDays(-165)
    $year = $Date.Year
    $Month = $("{0:00}" -f $Date.Month)
    $global:datearchivage = "$Month/$Month/$year"
    $FailedList = @()
    $DoneList = @()
    $LogDate = get-date -format  "yyyyMMdd-hhmm"
    $LogFolder = "C:\Log"
    
    
    write-host "#####################TEST des variables###################"
    write-host "les mail plus vieux que $datearchivage seront archivés"
    
    ################################################################## Récupération des boites à Archiver sur l'AD ##################################################################
    
    write-host "#####################Récupération des boites à Archiver sur l'AD#####################"
    
    #récupération des boites dont l'utilisateur correspondant se trouve une OU particulière de l'AD que l'on place dans une variable
    
    $MailBoxList = Get-Mailbox | Where-Object{$MailBox.OrganizationalUnit -eq "domaine.fr/TESTS/archivageauto"} | select Name, SamAccountName
    
    foreach {$MailBox in $MailBoxList) {
    
    #récupération du nom et du login de l'utilisateur correspondant à la boite en cours de traitement
    	$Nom = $MailBox.Name	
    	$Login = $MailBox.SamAccountName
    
        write-host "début de traitement pour $Nom"
    
    ################################################################## Archivage ##################################################################
    
    write-host "################################# Archivage de la boite de $Nom des mails plus vieux que $datearchivage #################################"
    
    write-host "vérification de l'emplacement du PST : \\FS\ARCHIVES\MEssagerie\$Login.pst"
    
    #Les exports précédent de la boite en cours de traitement, si il y en a, seront supprimés sinon les mails seront supprimés sans être archivé (voir plus loin pour comprendre)
    Get-MailboxExportRequest -Mailbox $Login | Remove-MailboxExportRequest -Confirm:$false
    
    #Export de la boite sans les contacts ni les éléments récupérables
    New-MailboxExportRequest -Mailbox $Login -ContentFilter "Received -le '$datearchivage'" -FilePath "\\FS\ARCHIVES\MEssagerie\$Login.pst" -ExcludeFolders "#Contacts#" -ExcludeDumpster
    	#Je vérifie que l'export est bien terminé avant de lancer la suppression (qu'il soit complété ou échoué... - la suite après la boucle)
        $exportrequest = Get-MailboxExportRequest -Mailbox $Login
        Write-Host "Statut de l'ExportRequest : "$exportrequest.Status
        while (!($exportrequest.Status -eq "Completed")) {
            #Des fois l'export reste en Queued et ne se lance pas, pour éviter d'être planté je force le traitement de l'export :
            while ($exportrequest.Status -eq "Queued") {
                Get-MailboxExportRequest -Mailbox $Login | Resume-MailboxExportRequest
                write-host "Lancement du processus d'archivage"
                Start-Sleep -s 3
                $exportrequest = Get-MailboxExportRequest -Mailbox $Login
                Write-Host "Statut de l'ExportRequest : "$exportrequest.Status
            }
            if ($exportrequest.Status -eq "failed") {
                write-host "Echec de l'archivage de la boite de $Nom en cours" -foregroundcolor red
                $FailedList += $MailBox
                # saut dans la boucle foreach
                continue
            }
            
    	    write-host "archivage de la boite de $Nom en cours"
            Start-Sleep -s 3
            $exportrequest=Get-MailboxExportRequest -Mailbox $Login
            Write-Host "Statut de l'ExportRequest : "$exportrequest.Status
        }
    
        # Si on arrive ici, c'est que l'archivage a réussi, je lance la suppression
    
            # Je nettoye la requête d'export maintenant que c'est terminé
            Get-MailboxExportRequest -Mailbox $Login | Remove-MailboxExportRequest -Confirm:$false
            write-host "Archivage de la BAL de $Nom termine"
    
            ################################################################## Suppression ##################################################################
    
            write-host "################################# Suppression des mails de la boite de $Nom plus vieux que $datearchivage #################################"
    
            #Recherche et suppression des mails uniquement selon la date choisie
            #Search-Mailbox -identity $Login -SearchQuery "Received<$datearchivage AND kind:email" -DeleteContent -Force
    
            #Le jour où vous on souhaite juste vérifier qu'il y a un résultat sans supprimer pour tester:
            Search-Mailbox -identity $Login -SearchQuery "Received<$datearchivage AND kind:email" -EstimateResultOnly
    
            write-host "Supression des mails de la boite de $Nom termine"
            write-host "Archivage de la BAL de $Nom termine"
    
            write-host "############################### fin de traitement pour $Nom ####################"
            $DoneList += $MailBox
        
    write-host "Traitement de la boite suivante dans l'OU"
    }
    
    write-host "Liste des boite mail failed"
    $FailedList | select name, samaccountname
    
    ## log
    $DoneList | select name, samaccountname | export-csv -path "$LogFolder\Done-$LogDate.csv" -encoding UTF8 -delimiter ";" -NoTypeInformation
    $FailedList | select name, samaccountname | export-csv -path "$LogFolder\Failed-$LogDate.csv" -encoding UTF8 -delimiter ";" -NoTypeInformation
    
    

    B.

    lundi 19 septembre 2016 14:37