Question Boucle sur le status d'une commande

Plus d'informations
il y a 2 mois 4 heures #29831 par phenryde
Bonjour,
Je souhaiterais intégrer des PST dans des mailbox et je construis un petit script pour ça.

J'execute mon script sur mon serveur Exchange avec le module POWERSHELL d'exchange et en tant qu'admin.

[code:1]
#########################################################################
# mise en place des variables
$user = 'pst-1'
#$user = $0
$mailbox_user = Get-Mailbox -identity $user
$mailbox_database = $mailbox_user.Database
$mailbox_sendQuota = $mailbox_user.ProhibitSendQuota.Value.ToBytes()
$emailadresse_user = ($mailbox_user.PrimarySmtpAddress).Address
$ID_user = $mailbox_user.DistinguishedName
#$PST_Name = \"$1\"
$PST_Name = \"pst-1-v2.pst\"
$PST_size = 0
$mailbox_size = 0
$ErrorLevel = 0


#########################################################################
# Création de la session Powershell sur MON_SERVEUR
$session_MON_SERVEUR = New-PSSession -ComputerName MON_SERVEUR.mondomaine.local


# on se positionne dans le répertoire de stockage des PST sur MON_SERVEUR et on ferme le fichier PST de l'utilisateur
Invoke-Command -Session $session_MON_SERVEUR -ScriptBlock { Set-Location J:\Messagerie }
Invoke-Command -Session $session_MON_SERVEUR -ScriptBlock { $PST_file = (Get-ChildItem -Recurse -Filter $Using:«»PST_Name).FullName }
Invoke-Command -Session $session_MON_SERVEUR -ScriptBlock { C:\dsit_niort\Sources_install\PSTools\psfile.exe -accepteula $PST_file -c }

# on modifie les ACL du fichier PST pour ajouter NIORT\g.proust, system et Exchange Trusted en FullControl
Invoke-Command -Session $session_MON_SERVEUR -ScriptBlock { $acl = Get-Acl -Path $PST_file }
Invoke-Command -Session $session_MON_SERVEUR -ScriptBlock { $AccessRule1 = New-Object System.Security.AccessControl.FileSystemAccessRule(\"NIORT\g.proust\",\"FullControl\",\"Allow\"«») }
Invoke-Command -Session $session_MON_SERVEUR -ScriptBlock { $AccessRule2 = New-Object System.Security.AccessControl.FileSystemAccessRule(\"NIORT\Exchange Trusted Subsystem\",\"FullControl\",\"Allow\"«») }
Invoke-Command -Session $session_MON_SERVEUR -ScriptBlock { $AccessRule3 = New-Object System.Security.AccessControl.FileSystemAccessRule(\"System\",\"FullControl\",\"Allow\"«») }
Invoke-Command -Session $session_MON_SERVEUR -ScriptBlock { $acl.SetAccessRule($AccessRule1) }
Invoke-Command -Session $session_MON_SERVEUR -ScriptBlock { $acl.SetAccessRule($AccessRule2) }
Invoke-Command -Session $session_MON_SERVEUR -ScriptBlock { $acl.SetAccessRule($AccessRule3) }
Invoke-Command -Session $session_MON_SERVEUR -ScriptBlock { $acl | Set-Acl $PST_file }
Invoke-Command -Session $session_MON_SERVEUR -ScriptBlock { Get-Acl -Path $PST_file | fl }

# taille du PST
$PST_size = Invoke-Command -Session $session_MON_SERVEUR -ScriptBlock { (Get-ChildItem $PST_file).Length }

# Suppression de la session Powershell vers MON_SERVEUR
Remove-PSSession -Session $session_MON_SERVEUR


#########################################################################
#Vidage des demande d'import deja complétée
Get-MailboxImportRequest -Status Completed | Remove-MailboxImportRequest -Confirm:$false


#########################################################################
# Récupération des différentes tailles PST, mailbox, datastore ...
# taille de la Mailbox
$mailbox_size = Get-MailboxStatistics -Identity $user | select TotalItemSize
$mailbox_size = $mailbox_size.TotalItemSize.Value.ToBytes()

# taille de la mailbox + le PST
$futur_size = $mailbox_size + $PST_size

# taille de l'espace libre sur le datastore de la BAL
$database_whitespace = (get-MailboxDatabase -Identity $mailbox_database -status | select AvailableNewMailboxSpace)
$database_whitespace = $database_whitespace.AvailableNewMailboxSpace.ToBytes()

# Petit récapitulatif
Write-Host \"Intégration du PST $PST_Name dans la BAL de $User\"
Write-host \"$PST_size = taille du PST $PST_Name\"
Write-Host \"$mailbox_size = taille de la Mailbox de $user\"
Write-Host \"$futur_size = taille de la BAL + du PST\"
Write-Host \"$mailbox_sendQuota = taille du quota sur la BAL de $user\"
Write-Host \"$database_whitespace = taille dispo dans le datastore $mailbox_database\"


#########################################################################
# on regarde si la BAL+PST rentreront dans le datastore, si trop gros on quitte le script avec une erreur
if ( $futur_size -gt $database_whitespace )
{
$ErrorLevel = $?
Write-host $ErrorLevel
Write-host -ForegroundColor Red \"ERREUR : Pas assez de place sur le datastore pour accueillir la BAL + le PST de l'utilisateur $user.\"
Exit $?
} else
{
Write-Host \"Ca passe dans la Database\"
}


# Comparaison de la taille de la future BAL avec la taille du quota
if ( $futur_size -gt $mailbox_sendQuota )
{
Write-host \"La future taille est plus grande que le quota deja présent sur la BAL\"
#suppression des quotas sur la BAL
if ( $mailbox_user.UseDatabaseQuotaDefaults -eq $true )
{
# suppression de l'utilisation des quotas par defaut du datastore
Set-Mailbox -Identity $user -UseDatabaseQuotaDefaults $false -ErrorAction stop -ErrorVariable
Set-Mailbox -Identity $mailbox_user -ProhibitSendReceiveQuota unlimited -ProhibitSendQuota unlimited -IssueWarningQuota unlimited -ErrorAction Stop
Write-host \"Suppression des quotas de la BAL fait.\"
}

#recupération du nom de fichier à partir de \\MON_SERVEUR.mondomaine.local\messagerie$
Set-Location \\MON_SERVEUR.mondomaine.local\messagerie$
$PST_File = (Get-ChildItem -Recurse -Filter $PST_Name).FullName

# DEMARRAGE de l'IMPORT
Write-host \"Debut de l'import du PST\"
$import_request_name = \"IMPORT_PST_$User\"
New-MailboxImportRequest -Name \" $import_request_name\" -FilePath \"$PST_File\" -Mailbox \"$emailadresse_user\" -TargetRootFolder \"Z_Import_Dossier_Personnel\" -ExcludeDumpster -AcceptLargeDataLoss -BadItemLimit 55 -LargeItemLimit 55

$status_import = (Get-MailboxImportRequest -Mailbox \"$ID_user\" | Get-MailboxImportRequestStatistics).StatusDetail

Do
{
Write-Host \"Pas encore fini\"
Start-Sleep 5
$status_import = (Get-MailboxImportRequest -Mailbox \"$ID_user\" | Get-MailboxImportRequestStatistics).StatusDetail
}
Until( ($status_import -like \"InProgress\"«») -or ($status_import -like \"queued\"«») )


#RECUPERATION DU RAPPORT une fois que la requete est COMPLETE
Get-MailboxImportRequest -Mailbox \"$ID_user\" | Get-MailboxImportRequestStatistics -IncludeReport |fl

}
[/code:1]

Et en fait je galère sur ma boucle.

Je voudrais faire une boucle sur tant que le status n'est pas Completed ou \"en erreur\" ou sur
Tant que le status est \"InProgress\" ou \"queued\"

Qu'il me teste le status et me le retourne, et une fois sur completed qu'il m'affiche le rapport.

Le but est a la fin de rajouter une liste de user et pst associé et de faire en sorte que 10 requetes maxi tournent en meme temps.

j'ai a peu près 700 PST à intégrer dans des BAL !!!

Je ne prends peut-être pas le pb dans le bon sens, mais la je tourne en boucle (pas comme mon script).

Merci pour votre aide et vos retours

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

Plus d'informations
il y a 1 mois 4 semaines #29832 par Laurent Dardenne
Salut,
pour ton problème voir ceci : While vs Repeat .
Le premier appel peut renvoyer une valeur qui n'est pas considérée par la suite et peut être écrasée par la seconde appel.
Je te laisse vérifier.

Ensuite Invoke-Command peut exécuter + commandes dans un scriptblock.
L'opérateur -like me semble inapproprié, -eq le serait peut être plus. -Like sans la présence de % recherche une égalité de chaîne de caractère.<br><br>Message édité par: Laurent Dardenne, à: 10/05/20 14:35

Tutoriels PowerShell

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

Plus d'informations
il y a 1 mois 4 semaines #29834 par phenryde
Bonjour

Merci pour ce retour.

Je vais voir si la commande repeat ne serait pas plus judiciable du coup.

Et pour le script-block, pareil je vais le mettre en oeuvre ce sera plus \&quot;propre\&quot;.

Je reviens vous donner des news sur ces évolutions dès qu'elles seront testées.

Merci

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

Plus d'informations
il y a 1 mois 4 semaines #29835 par Laurent Dardenne
Salut,
ne connaissant pas ces cmdlets, j'ai essayé de trouver sur le net les états renvoyés.
Je suis tombé sur ceci ( erreur potentielle) :
letsexchange.blogspot.com/2017/01/get-mo...-job-is-waiting.html

Et en lisant cela :
practical365.com/exchange-server/complet...sts-migration-batch/

thoughtsofanidlemind.com/2010/11/22/clea...ilbox-move-requests/

Je ne sais pas trop si tu reçois un objet qui englobe plusieurs actions ou plusieurs objet, un objet pour chaque action, ayant un statut différent.

Du coup je ne sais pas trop si, pour la variable $status_import, tu attends un tableau d'objet ou un seul...

Tutoriels PowerShell

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

Plus d'informations
il y a 1 mois 3 semaines #29841 par phenryde
Bonjour

Moi j'attendrais un seul objet pas un tableau.

Je regarde vos liens et je vois si cela m'aide a avancer plus dans mon script.

Merci beaucoup pour ce retour

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

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