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 <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

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               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

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.

Odpowiedzi:


90

Użyj Start-Sleeppolecenia:

Start-Sleep -s 10

wstrzyma skrypt na 10 sekund.


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.


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


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.