web-dev-qa-db-fra.com

Besoin d'ajouter une commande "Wait" à un script Powershell

Voici mon code actuel:

Write-output “ENTER THE FOLLOWING DETAILS - When Creating Multiple New Accounts Go to           EMC hit F5(refresh) and make sure previous new account is listed before proceeding to the       next one”
$DName = Read-Host “User Diplay Name(New User)"
$RUser = Read-Host "Replicate User(Database Grab)"
$RData = ((Get-Mailbox -Identity $RUser).Database).DistinguishedName
$REmailInput = Read-Host “Requester's Name(Notification Email goes to this Person)"
$REmail = ((Get-Mailbox -Identity "$REmailInput").PrimarySmtpAddress).ToString()

Enable-Mailbox -Identity "$DName" -Database "$RData" 
Set-CASMailbox -Identity "$DName" -ActiveSyncEnabled $false -ImapEnabled $false -    PopEnabled $false


Send-MailMessage -From "John Doe <[email protected]>" -To $REmail -Subject       "$DName's email account" -Body "$DName's email account has been setup.`n`n`nJohn Doe`nXYZ`nSystems Administrator`nOffice: 123.456.7890`[email protected]" -SmtpServer [email protected]

Ce code fonctionne parfaitement environ la moitié du temps, mais l'autre moitié j'obtiens cette erreur en retour:

ENTER THE FOLLOWING DETAILS - When Creating Multiple New Accounts Go to EMC hit
F5(refresh) and make sure previous new account is listed before proceeding to
the next one
User Diplay Name(New User): Jane Doe
Replicate User(Database Grab): Julie Doe
Requester's Name(Notification Email goes to this Person): Joanna Doe

Name                      Alias                ServerName       ProhibitSendQuo
                                                            ta
----                      -----                ----------       ---------------
Jane Doe                  JDDAFA               [email protected]      unlimited
Set-CASMailbox : Jane Doe is not a mailbox user.
At C:\emailclientbasic.ps1:11 char:15
+ Set-CASMailbox <<<<  -Identity "$DName" -ActiveSyncEnabled $false -ImapEnable
d $false -PopEnabled $false
+ CategoryInfo          : NotSpecified: (0:Int32) [Set-CASMailbox], Manage
mentObjectNotFoundException
+ FullyQualifiedErrorId : 292DF1AC,Microsoft.Exchange.Management.Recipient
Tasks.SetCASMailbox

Donc, si quelqu'un pouvait m'aider à lancer une sorte de commande d'attente après la création de la boîte aux lettres et attendre que la boîte aux lettres de l'utilisateur soit créée avant que le script ne désactive ActiveSync, etc., ce serait vraiment utile. Je pense que l'utilisation du commutateur -wait ne fonctionne pas.

41
Paul Masek

Utilisez le Start-Sleep commande:

Start-Sleep -s 10

mettra le script en pause pendant 10 secondes.

95
Sven

J'ai dû faire face à un certain timing dans un script Exchange que j'ai écrit il y a quelque temps. Plus précisément, je devais modifier les autorisations sur un groupe de distribution nouvellement créé, mais je devais attendre que le groupe de distribution soit réellement créé avant d'essayer de le modifier.

do {
    sleep -seconds 1
    $mailboxExists = get-mailboxpermission -Identity "CN=$displayName,$DN" -User "NT AUTHORITY\SELF" -ErrorAction SilentlyContinue |fw IsValid
    write-Host "." -nonewline
} while (!$mailboxExists)

Il tente simplement de retirer l'attribut "IsValid" de la boîte aux lettres (dans cet exemple) en tant que proxy pour "la boîte aux lettres existe". Une fois que get-mailboxpermission renvoie vrai, l'étape suivante, la définition d'une autorisation fonctionnera réellement. Le write-Host est juste pour fournir une barre de progression.

8
sysadmin1138

Vous pouvez l'exécuter en tant que tâche d'arrière-plan, puis attendre la fin de cette tâche. Comme ça:

$ enablemb = Start-Job {Enable-Mailbox -Identity "$ DName" -Database "$ RData"}
Wait-Job $ enablemb
Receive-Job $ enablemb

4
Jason Berg

Pourquoi pas quelque chose comme:

do {
$testpath = Test-Path -path \\dns2\d$\test
}
until ($testpath -eq $true)

J'utilise ce type de commande avec un _ start-sleep après le test initial car faire jusqu'à mange beaucoup de cycles de processeur sans lui. Donc le mien ressemble plus à ceci:

do {
$testpath = Test-Path -path \\dns2\d$\test
start-sleep -s 10}
until ($testpath -eq $true)

Si le test va changer d'état rapidement, ne vous inquiétez pas du start-sleep.

1
Sean
1
Bret Fisher