Потрібно додати команду «Зачекайте» до сценарію 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 тощо, це було б дуже корисно. Я вважаю, що просто використовувати перемикач -cait не працює.

Відповіді:


90

Використовуйте Start-Sleepкоманду:

Start-Sleep -s 10

призупинить сценарій на 10 секунд.


Дякую Свен! Я дуже добре можу це використати, але мені хотілося б чогось більш ефективного, особливо коли я додаю кілька облікових записів. Також характер цієї проблеми, в першу чергу, полягає в тому, що щоразу, коли обмінна пошта дозволяє обліковим записам, змінюється кількість часу, отже, той факт, що вона працює непогано половину часу.
Пол Машек

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! Схоже, ваша ситуація паралельна моїй точно, так що теоретично вона повинна працювати без замикання. Я також спробую це!
Пол Машек

@Paul Я почав зі статичним очікуванням, але фактичне очікування залежало від того, наскільки завантажена система Exchange іншими речами. Тож мені довелося з нею йти динамічно, що працює набагато краще!
sysadmin1138

Я повністю згоден, як ви бачили з моїх первинних відповідей на @Bret Fisher та @SvenW, саме така моя ситуація.
Павло Машек

Я зараз це намагаюся: початок повинен бути змінною чи він не повинен мати $ на початку і бути командою? Це не працює так, як є. На даний момент у вас вставлений ваш код прямо перед моїм рядком "Enable-Mailbox -Identity" $ DName "-Database" $ RData ".
Пол Машек,

Я також спробував це відразу після "Enable-Mailbox ..." і отримав цю саму помилку: "Термін" false "не розпізнається як ім'я командлета, функції, файлу сценарію чи операційної програми. Перевірте написання ім'я, або якщо шлях включено, перевірте правильність шляху та повторіть спробу. На 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 "не розпізнається як ім'я командлету, функції, файлу сценарію чи функціонуючої програми. Перевірте написання імені, або якщо шлях включений, переконайтеся, що шлях є правильним і спробуйте ще раз. + CategoryInfo: ObjectNotFound: (Enable-Mailbox: String) [], Comm andNotFoundException + FullyQualifiedErrorId: CommandNotFoundException "
Пол

1

Початок сну = зачекайте х секунд

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.