Musisz dodać polecenie „Czekaj” do skryptu Powershell

39

Oto mój obecny kod:

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

Ten kod działa bezbłędnie przez około połowę czasu, ale w drugiej połowie otrzymuję ten błąd:

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

Więc jeśli ktoś mógłby mi pomóc w rzuceniu polecenia oczekiwania po utworzeniu skrzynki pocztowej i poczekaniu, aż skrzynka użytkownika zostanie utworzona, zanim skrypt wyłączy ActiveSync itp., Byłoby to naprawdę pomocne. Uważam, że samo użycie przełącznika -wait nie działa.

Paul Masek
źródło

Odpowiedzi:

90

Użyj Start-Sleeppolecenia:

Start-Sleep -s 10

wstrzyma skrypt na 10 sekund.

Sven
źródło
Dzięki Sven! Bardzo dobrze mogę z tego skorzystać, ale chciałbym czegoś bardziej wydajnego, szczególnie w przypadku dodawania wielu kont. Charakter tego problemu polega przede wszystkim na tym, że za każdym razem, gdy poczta Exchange włącza konta, ilość czasu jest różna, stąd też połowa czasu działa dobrze.
Paul Masek
5
Nie korzystam z programu Exchange, więc nie znam tego polecenia cmdlet, ale chciałbym znaleźć polecenie, które sprawdza, czy zasób istnieje, a jeśli nie, przechodzi w cykl wstrzymania, dopóki nie istnieje. Coś w tym stylu: w while ( res-not-exist ) { Start-Sleep -s 1}ten sposób zatrzymujesz skrypt tylko tak długo, jak to konieczne i tylko wtedy, gdy jest to konieczne.
Sven
Łał! Tak, zgadzam się, że to świetna droga! Czy ktoś inny może dodać do pomysłu Svena? Czy to realna droga?
Paul Masek
Tymczasowo korzystam teraz z Twojej początkowej sugestii ... +1 Zmieniłem ją na 5 sekund i to wydaje się wystarczające.
Paul Masek
8

Musiałem poradzić sobie z pewnym czasem w skrypcie Exchange, który napisałem jakiś czas temu. W szczególności musiałem zmodyfikować uprawnienia do nowo utworzonej grupy dystrybucyjnej, ale musiałem poczekać, aż grupa dystrybucyjna zostanie faktycznie utworzona, zanim spróbuję ją zmodyfikować.

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

Próbuje po prostu usunąć atrybut „IsValid” ze skrzynki pocztowej (w tym przykładzie) jako serwer proxy dla „skrzynki pocztowej istnieje”. Po get-mailboxpermissionzwróceniu wartości true następny krok, faktycznie ustawiony, będzie działał. Jest write-hostto po prostu, aby zapewnić pasek postępu.

sysadmin1138
źródło
hmm, wow, dzięki sysadmin1138! Wygląda na to, że Twoja sytuacja jest dokładnie taka sama, jak moja, więc teoretycznie powinna działać bez żadnych problemów. Spróbuję również tego!
Paul Masek
@Paul Zacząłem od statycznych oczekiwań, ale faktyczne oczekiwanie zależało od obciążenia systemu Exchange innymi rzeczami. Musiałem więc działać dynamicznie, co działa znacznie lepiej!
sysadmin1138
W pełni się zgadzam, jak widać z moich pierwszych odpowiedzi na @Bret Fisher i @SvenW, dokładnie taka jest moja sytuacja.
Paul Masek
Próbuję tego teraz, czy początek powinien być zmienną, czy nie powinien mieć $ na początku i być poleceniem? To nie działa tak jak jest. W tej chwili mam Twój kod wstawiony tuż przed moją linią „Enable-Mailbox -Identity” $ DName ”-Database„ $ RData ”.
Paul Masek
Próbowałem też zaraz po „Enable-Mailbox ...” i otrzymałem ten sam błąd: „Termin„ false ”nie jest rozpoznawany jako nazwa polecenia cmdlet, funkcji, pliku skryptu lub programu operacyjnego. Sprawdź pisownię nazwa lub jeśli ścieżka została dołączona, sprawdź poprawność ścieżki i spróbuj ponownie. W C: \ emailclientbasic.ps1: 18 char: 23 + $ mailboxExists = false <<<< + CategoryInfo: ObjectNotFound: (false: String) [], CommandNotFou ndException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek
3

Możesz uruchomić go jako zadanie w tle, a następnie poczekać na zakończenie tego zadania. Lubię to:

$ enablemb = Rozpocznij zadanie {Enable-Mailbox -Identity "$ DName" -Database "$ RData"}
Czekaj-Job $ enablemb
Receive-Job $ enablemb

Jason Berg
źródło
Dzięki Jason! Zacznę się tym przyglądać i zobaczę, co mogę z tym zrobić.
Paul Masek
Próbowałem skomentować moją linię włączania skrzynki pocztowej i zastąpić twoje zalecenie. Wystąpił ten błąd: „Termin„ Enable-Mailbox ”nie jest rozpoznawany jako nazwa polecenia cmdlet, funkcji, pliku skryptu lub programu operacyjnego. Sprawdź pisownię nazwy lub, jeśli ścieżka została uwzględniona, sprawdź, czy ścieżka jest poprawny i spróbuj ponownie. + CategoryInfo: ObjectNotFound: (Enable-Mailbox: String) [], Comm andNotFoundException + FullyQualifiedErrorId: CommandNotFoundException ”
Paul Masek
1

Start-Sleep = poczekaj x sekund

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

Bret Fisher
źródło
Dzięki, Bret, ale jak powiedziałem Svenowi, szukam bardziej inteligentnego polecenia, które mogłoby być kontynuowane, gdy konto ma włączoną obsługę poczty. Statyczny czas oczekiwania nie pomoże w mojej sytuacji.
Paul Masek
1

Dlaczego nie coś takiego:

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

Używam tego typu polecenia z dodatkowym testem start-sleeppo wstępnym teście, ponieważ robię to, dopóki nie zje dużo cykli procesora bez niego. Więc moje wygląda mniej więcej tak:

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

Jeśli test zmieni stan szybko, nie przejmuj się start-sleep.

Sean
źródło