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

39

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 exchange@xyz.com

Ce code fonctionne parfaitement environ la moitié du temps, mais l'autre moitié, je reçois 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 celle-ci soit créée avant que le script ne désactive ActiveSync, etc., cela serait vraiment utile. Je crois que simplement utiliser le commutateur -wait ne fonctionne pas.

Paul Masek
la source

Réponses:

90

Utilisez la Start-Sleepcommande:

Start-Sleep -s 10

mettra le script en pause pendant 10 secondes.

Sven
la source
Merci Sven! Je pourrais très bien l'utiliser, mais j'aimerais quelque chose de plus efficace, en particulier lorsque j'ajoute plusieurs comptes. En outre, la nature de ce problème tient d’abord au fait qu’il existe différentes durées de temps chaque fois que la messagerie Exchange active des comptes, d’où le fait que cela fonctionne correctement la moitié du temps.
Paul Masek,
5
Je n'utilise pas Exchange. Je ne connais donc pas bien les cmdlets à ce sujet, mais ce que je ferais, c'est d'essayer de trouver une commande qui vérifie si la ressource existe et si ce n'est pas le cas, passe en cycle d'attente jusqu'à ce qu'elle existe. Quelque chose comme ceci: De while ( res-not-exist ) { Start-Sleep -s 1}cette façon, vous n'arrêtez le script que tant que cela est nécessaire et uniquement si cela est nécessaire.
Sven
Hou la la! Ouais, je suis d'accord, ça a l'air d'être une bonne façon de faire! Quelqu'un d'autre peut-il ajouter quelque chose à l'idée de Sven? Est-ce une solution envisageable?
Paul Masek
J'utilise temporairement votre suggestion initiale pour l'instant ... +1, je l'ai changée en 5 secondes et cela semble être suffisant.
Paul Masek
8

J'ai dû composer avec un 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 de tenter 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 d'obtenir 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 la valeur est get-mailboxpermissionvraie, la prochaine étape, définir une permission, fonctionnera réellement. Le write-hostest juste pour fournir une barre de progression.

sysadmin1138
la source
hmm, wow, merci sysadmin1138! Il semble que votre situation soit parallèle à la mienne exactement, alors elle devrait théoriquement fonctionner sans accroc. Je vais essayer cela aussi!
Paul Masek
@ Paul J’ai commencé avec des attentes statiques, mais l’attente réelle dépendait de la charge du système Exchange avec d’autres choses. Je devais donc aller avec dynamique, ce qui fonctionne beaucoup mieux!
sysadmin1138
Je suis tout à fait d’accord, comme vous le constaterez dans mes réponses initiales à @Bret Fisher et @SvenW, c’est exactement la même situation.
Paul Masek,
J'essaie ceci maintenant, est-ce que le début est supposé être une variable ou ne devrait-il pas avoir le $ au début et être une commande? Cela ne fonctionne pas tel quel. À partir de maintenant, votre code est inséré juste avant ma ligne "Enable-Mailbox -Identity" $ DName "-Base de données" $ RData "
Paul Masek,
Je l'ai également essayé juste après "Enable-Mailbox ..." et j'ai obtenu la même erreur. "Le terme 'false' n'est pas reconnu comme nom d'une applet de commande, d'une fonction, d'un fichier de script ou d'un programme utilisable. Vérifiez l'orthographe de le nom, ou si un chemin est inclus, vérifiez que le chemin est correct et essayez à nouveau: C: \ emailclientbasic.ps1: 18 caractère: 23 + $ mailboxExists = false <<<< + CategoryInfo: ObjectNotFound: (false: String) [], CommandNotFou ndException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek,
3

Vous pouvez l'exécuter en tant que tâche en 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

Jason Berg
la source
Merci Jason! Je vais commencer à regarder cela et voir ce que je peux faire avec ça.
Paul Masek
J'ai essayé de commenter ma ligne enable-mailbox et de substituer votre recommandation. J'ai eu cette erreur, "Le terme 'Enable-Mailbox' n'est pas reconnu comme le nom d'une applet de commande, d'une fonction, d'un fichier de script ou d'un programme exploitable. Vérifiez l'orthographe du nom ou, si un chemin a été inclus, vérifiez que le chemin est correct et essayez à nouveau. + CategoryInfo: ObjectNotFound: (Enable-Mailbox: String) [], Comm etNotFoundException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek,
1

Start-Sleep = attend x secondes

http://technet.microsoft.com/en-us/library/ee177002.aspx

Bret Fisher
la source
Merci Bret, mais comme je l'ai dit à Sven, je recherche une commande plus intelligente pour pouvoir continuer lorsque le compte est à extension messagerie. Un temps d'attente statique ne va pas aider dans ma situation.
Paul Masek
1

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 complément start-sleepaprès le test initial, car il ne consomme pas beaucoup de cycles du processeur. Alors le mien ressemble plus à ceci:

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

Si le test doit changer d’état rapidement, ne vous inquiétez pas start-sleep.

Sean
la source