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 <John.Doe@xyz.com>" -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`nJohn.Doe@xyz.com" -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               exchange@xyz.com      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.

Réponses:


90

Utilisez la Start-Sleepcommande:

Start-Sleep -s 10

mettra le script en pause pendant 10 secondes.


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.


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


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.