54 votes

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 <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é, 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               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 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 crois que le simple fait d'utiliser le commutateur -wait ne fonctionne pas.

119voto

Sven Points 95985

を使用します。 Start-Sleep commandement :

Start-Sleep -s 10

mettra en pause le script pendant 10 secondes.

8voto

sysadmin1138 Points 129885

J'ai eu à gérer un certain timing dans un script d'Exchange que j'ai écrit il y a quelque temps. Plus précisément, j'avais besoin de modifier les permissions sur un groupe de distribution nouvellement créé, mais je devais attendre que le groupe de distribution soit effectivement 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) comme proxy pour "la boîte aux lettres existe". Une fois que get-mailboxpermission retourne vrai, l'étape suivante, la définition d'une permission, fonctionnera réellement. Le site write-host est juste pour fournir une barre de progression.

4voto

Jason Berg Points 18864

Vous pourriez l'exécuter en tant que tâche d'arrière-plan et attendre que cette tâche se termine. Comme ceci :

$enablemb = Start-Job { Enable-Mailbox -Identity "$DName" -Database "$RData" }
Attendre-Job $enablemb
Recevoir-Job $enablemb

1voto

Peter Bagnall Points 738

1voto

Vladimir Points 376

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-sleep après le test initial parce que faire jusqu'à consomme beaucoup de cycles de processeur sans cela. Donc le mien ressemble plus à ça :

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

Si le test doit changer d'état rapidement, quand ne vous préoccupez pas de l'indicateur start-sleep .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X