Sie müssen einem Powershell-Skript einen "Wait" -Befehl hinzufügen

39

Hier ist mein aktueller Code:

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

Dieser Code funktioniert ungefähr die Hälfte der Zeit einwandfrei, aber die andere Hälfte bekomme ich diesen Fehler zurück:

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

Wenn mir jemand helfen könnte, nach dem Erstellen des Postfachs einen Wartebefehl einzugeben und zu warten, bis das Postfach des Benutzers erstellt ist, bevor das Skript ActiveSync usw. deaktiviert, wäre dies sehr hilfreich. Ich glaube, dass es nicht funktioniert, einfach den Schalter -wait zu verwenden.

Paul Masek
quelle

Antworten:

90

Verwenden Sie den Start-SleepBefehl:

Start-Sleep -s 10

hält das Skript für 10 Sekunden an.

Sven
quelle
Danke Sven! Ich könnte dies sehr gut verwenden, aber ich möchte etwas effizienteres, insbesondere wenn ich mehrere Konten hinzufüge. Dieses Problem besteht in erster Linie darin, dass die Zeit, die Exchange-E-Mails für die Aktivierung von Konten benötigt, unterschiedlich ist, weshalb es in der Hälfte der Fälle problemlos funktioniert.
Paul Masek
5
Ich verwende Exchange nicht, daher bin ich mit Cmdlets in dieser Hinsicht nicht vertraut. Ich würde jedoch versuchen, einen Befehl zu finden, der überprüft, ob die Ressource vorhanden ist, und in einen Haltezyklus übergeht, bis sie vorhanden ist. So etwa: Auf while ( res-not-exist ) { Start-Sleep -s 1}diese Weise halten Sie das Skript nur so lange an, wie es erforderlich ist und nur, wenn es erforderlich ist.
Sven
Beeindruckend! Ja, ich stimme zu, das klingt nach einem großartigen Weg! Kann noch jemand die Idee von Sven ergänzen? Ist das ein praktikabler Weg?
Paul Masek
Ich verwende momentan vorübergehend Ihren ursprünglichen Vorschlag ... +1 Ich habe ihn in 5 Sekunden geändert, und das scheint ausreichend zu sein.
Paul Masek
8

Ich musste mich in einem Exchange-Skript, das ich vor einiger Zeit geschrieben hatte, mit dem Timing befassen. Insbesondere musste ich die Berechtigungen für eine neu erstellte Verteilergruppe ändern, aber ich musste warten, bis die Verteilergruppe tatsächlich erstellt wurde, bevor ich versuchte, sie zu ändern.

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

Es wird nur versucht, das Attribut "IsValid" aus der Mailbox zu entfernen (in diesem Beispiel), als Proxy für "Mailbox existiert". Sobald get-mailboxpermissiontrue zurückgegeben wird, funktioniert der nächste Schritt, das Festlegen einer Berechtigung, tatsächlich. Das write-hostist nur eine Fortschrittsanzeige.

sysadmin1138
quelle
hmm, wow, danke sysadmin1138! Es sieht so aus, als ob Ihre Situation genau meiner entspricht, also sollte sie theoretisch ohne Probleme funktionieren. Ich werde das auch versuchen!
Paul Masek
@Paul Ich begann mit statischen Wartezeiten, aber die tatsächliche Wartezeit hing davon ab, wie stark das Exchange-System mit anderen Dingen ausgelastet war. Also musste ich dynamisch damit umgehen, was viel besser funktioniert!
sysadmin1138
Ich stimme voll und ganz zu, wie Sie aus meinen ersten Antworten auf @Bret Fisher und @SvenW ersehen können, ist das genau meine gleiche Situation.
Paul Masek
Ich versuche das jetzt, soll der Anfang eine Variable sein oder sollte er nicht das $ am Anfang haben und ein Befehl sein? Es funktioniert nicht so wie es ist. Ab sofort habe ich Ihren Code direkt vor meiner Zeile "Enable-Mailbox -Identity" $ DName "-Database" $ RData "eingefügt.
Paul Masek
Ich habe es auch direkt nach "Enable-Mailbox ..." versucht und den gleichen Fehler erhalten: "Der Begriff" false "wird nicht als Name eines Cmdlets, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt Überprüfen Sie den Namen oder, falls ein Pfad angegeben wurde, ob der Pfad korrekt ist, und versuchen Sie es erneut: C: \ emailclientbasic.ps1: 18 char: 23 + $ mailboxExists = false <<<< + CategoryInfo: ObjectNotFound: (false: String) [], CommandNotFou ndException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek
3

Sie können es als Hintergrundjob ausführen und dann warten, bis dieser Job abgeschlossen ist. So was:

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

Jason Berg
quelle
Vielen Dank, Jason! Ich werde mich damit befassen und herausfinden, was ich damit anfangen kann.
Paul Masek
Ich habe versucht, meine Enable-Mailbox-Zeile zu kommentieren und Ihre Empfehlung zu ersetzen. Ich habe folgende Fehlermeldung erhalten: "Der Begriff" Postfach aktivieren "wird nicht als Name eines Cmdlets, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder überprüfen Sie den Pfad, falls ein Pfad angegeben wurde korrekt ist , und versuchen Sie es erneut + CategoryInfo: ObjectNotFound: (Enable-Mailbox: String) [], Comm andNotFoundException + FullyQualifiedErrorId: CommandNotFoundException“.
Paul Masek
1

Start-Sleep = x Sekunden warten

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

Bret Fisher
quelle
Danke Bret, aber wie ich Sven sagte, bin ich auf der Suche nach einem intelligenteren Befehl, um tatsächlich fortzufahren, wenn das Konto für E-Mails aktiviert wurde. Eine statische Wartezeit hilft in meiner Situation nicht.
Paul Masek
1

Warum nicht so etwas wie:

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

Ich benutze diese Art von Befehlen mit einem Zusatz start-sleepnach dem ersten Test, weil do, bis es viele Prozessorzyklen ohne ihn isst. Meine sieht also eher so aus:

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

Wenn sich der Zustand des Tests schnell ändert, machen Sie sich keine Sorgen um die start-sleep.

Sean
quelle