Нужно добавить команду «Ожидание» в скрипт Powershell

39

Вот мой текущий код:

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

Этот код работает без проблем примерно половину времени, но другую половину я получаю эту ошибку в ответ:

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

Поэтому, если кто-нибудь может помочь мне добавить какую-нибудь команду ожидания после создания почтового ящика и дождаться создания почтового ящика пользователя, прежде чем сценарий отключит ActiveSync и т. Д., Это было бы очень полезно. Я считаю, что просто использование ключа -wait не работает.

Пол Масек
источник

Ответы:

90

Используйте Start-Sleepкоманду:

Start-Sleep -s 10

приостановит выполнение сценария на 10 секунд.

Свен
источник
Спасибо Свен! Я очень хорошо мог бы использовать это, но я хотел бы что-то более эффективное, особенно когда я добавляю несколько учетных записей. Кроме того, суть этой проблемы, во-первых, заключается в том, что каждый раз, когда почта Exchange включает учетные записи, существует разное количество времени, поэтому в половине случаев она работает нормально.
Пол Масек
5
Я не использую Exchange, поэтому я не знаком с командлетами по этому поводу, но я бы попытался найти команду, которая проверяет, существует ли ресурс и, если нет, входит в цикл ожидания, пока он не существует. Примерно так: while ( res-not-exist ) { Start-Sleep -s 1}таким образом вы останавливаете скрипт только на столько времени, сколько необходимо и только если это необходимо.
Свен
Вот Это Да! Да, я согласен, это звучит как отличный способ пойти! Кто-нибудь еще может добавить к идее Свена? Это осуществимый путь?
Пол Масек
Сейчас я временно использую ваше первоначальное предложение ... +1 Я изменил его на 5 секунд, и этого кажется достаточным.
Пол Масек
8

Мне пришлось иметь дело с определенным временем в сценарии Exchange, который я написал некоторое время назад. В частности, мне нужно было изменить разрешения для вновь созданной группы рассылки, но нужно было подождать, пока группа рассылки фактически не будет создана, прежде чем пытаться изменить ее.

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

Он просто пытается получить атрибут «IsValid» из почтового ящика (в этом примере) в качестве прокси для «почтового ящика существует». Как только get-mailboxpermissionвернется true, следующим шагом будет установка разрешения. Это write-hostпросто для того, чтобы обеспечить индикатор выполнения.

sysadmin1138
источник
хм, вау, спасибо sysadmin1138! Похоже, ваша ситуация параллельна моей, поэтому теоретически она должна работать без заминки. Я тоже попробую!
Пол Масек
@Paul Я начал со статического ожидания, но фактическое время ожидания зависело от того, насколько загружена система Exchange с другими вещами. Таким образом, я должен был идти динамично с этим, который работает намного лучше!
sysadmin1138
Я полностью согласен, как вы могли видеть из моих первоначальных ответов на @Bret Fisher и @SvenW, это точно моя ситуация.
Пол Масек
Я пытаюсь это сейчас, начало должно быть переменной или не должно иметь $ в начале и быть командой? Это не работает как есть. На данный момент ваш код вставлен прямо перед моей строкой "Enable-Mailbox -Identity" $ DName "-Database" $ RData ".
Пол Масек
Я также попытался сделать это сразу после «Enable-Mailbox ...» и получил ту же ошибку: «Термин« ложь »не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте правильность написания имя или, если путь был включен, проверьте правильность пути и попробуйте снова. В C: \ emailclientbasic.ps1: 18 char: 23 + $ mailboxExists = false <<<< + CategoryInfo: ObjectNotFound: (false: String) [], CommandNotFou ndException + FullyQualifiedErrorId: CommandNotFoundException "
Пол Масек
3

Вы можете запустить его как фоновое задание, а затем дождаться его завершения. Так:

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

Джейсон Берг
источник
Спасибо Джейсон! Я собираюсь начать изучать это и посмотреть, что я могу с этим сделать.
Пол Масек
Я попытался закомментировать мою строку enable-mailbox и заменить вашу рекомендацию. Я получил эту ошибку: «Термин« Enable-Mailbox »не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте правильность написания имени или, если указан путь, убедитесь, что путь правильно и попробуйте снова. + CategoryInfo: ObjectNotFound: (Enable-Mailbox: String) [], Comm andNotFoundException + FullyQualifiedErrorId: CommandNotFoundException "
Пол Масек
1

Start-Sleep = подождите х секунд

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

Брет фишер
источник
Спасибо, Брет, но, как я сказал Свену, я ищу более разумную команду, которая будет действовать, когда для учетной записи включена поддержка почты. Статическое время ожидания не поможет в моей ситуации.
Пол Масек
1

Почему не что-то вроде:

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

Я использую этот тип команды с дополнительным start-sleepпосле начального теста, потому что до тех пор, пока не съест много циклов процессора без него. Так что мой выглядит больше так:

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

Если тест собирается быстро изменить состояние, когда не беспокойтесь о start-sleep.

Шон
источник