Powershell betiğine “Bekle” komutu eklemeniz gerekiyor


39

İşte şu anki kodum:

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

Bu kod zamanın yaklaşık yarısında kusursuz çalışıyor ancak diğer yarısı karşılığında bu hatayı alıyorum:

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

Eğer biri bana posta kutusu oluşturulduktan sonra bir çeşit bekle emrini atmama yardım edebilir ve komut dosyası ActiveSync'i devre dışı bırakmadan önce kullanıcının posta kutusu oluşturulmasını bekler, vb. Gerçekten yardımcı olacaktır. Bekle-anahtarını kullanmanın işe yaramadığına inanıyorum.

Yanıtlar:


90

Start-SleepKomutu kullanın :

Start-Sleep -s 10

betiği 10 saniye duraklatacak.


Teşekkürler Sven! Bunu çok iyi kullanabilirim, ancak özellikle birden fazla hesap eklerken daha etkili bir şey istiyorum. Ayrıca, ilk olarak bu sorunun niteliği, Exchange postasının hesapları her açışında çeşitli zamanlar olmasıdır, bu nedenle zamanın yarısında işe yarar.
Paul Masek

5
Exchange kullanmıyorum, bu nedenle cmdlet'lere aşina değilim, ancak yapacağım şey kaynağın var olup olmadığını kontrol eden ve yoksa var olana kadar bir tutma döngüsüne giren bir komut bulmaya çalışmak. Bunun gibi bir şey: while ( res-not-exist ) { Start-Sleep -s 1}Bu şekilde, senaryoyu yalnızca gerekli olduğu sürece ve yalnızca gerekli olduğunda durdurabilirsiniz.
Sven

Vaov! Evet, harika bir yol gibi göründüğüne katılıyorum! Sven'in fikrine başka biri ekleyebilir mi? Bu gitmek için uygun bir yol mu?
Paul Masek

Şu an için ilk önerinizi geçici olarak kullanıyorum ... +1 5 saniye olarak değiştirdim ve bu yeterli görünüyor.
Paul Masek

8

Bir süre önce yazdığım bir Exchange betiğinde zamanlama ile uğraşmak zorunda kaldım. Özellikle, yeni oluşturulan bir dağıtım grubundaki izinleri değiştirmem gerekiyordu, ancak değişiklik yapmayı denemeden önce dağıtım grubunun gerçekten oluşturulmasını beklemem gerekiyordu.

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

Sadece "IsValid" özelliğini posta kutusundan (bu örnekte) "posta kutusu var" için bir proxy olarak almaya çalışır. Bir kez get-mailboxpermissiondoğru döndüğünde, bir sonraki adım, bir izin ayarlamak gerçekten işe yarayacaktır. write-hostSadece bir ilerleme çubuğu sağlamaktır.


hmm, vay, sysadmin1138 teşekkürler! Durumunuz aynen benimkiyle paralellik gösteriyor, bu nedenle teorik olarak aksamadan çalışması gerekiyor. Bunu da deneyeceğim!
Paul Masek

@Paul Statik beklemelerle başladım, ancak gereken gerçek bekletme, Exchange sisteminin diğer şeylerle ne kadar yüklü olduğuna bağlıydı. Bu yüzden daha iyi çalışan onunla dinamikleşmek zorunda kaldım!
sysadmin1138

Tam olarak aynı fikirdeyim, @ Bret Fisher ve @SvenW’e verdiğim ilk yanıtlardan da aynı şekilde görüldüğü gibi.
Paul Masek

Bunu şimdi deniyorum, başlangıç ​​değişken mi olmalı yoksa başlangıçta $ olmalı ve bir komut mu olmalı? Olduğu gibi çalışmıyor. Şu an itibariyle "Enable-Mailbox -Identity" $ DName "-Database" $ RData "satırımdan hemen önce kodunuzu girdim.
Paul Masek

Ayrıca, "Enable-Mailbox ..." 'dan hemen sonra denedim ve aynı hatayı aldım, "false" terimi bir cmdlet, işlev, komut dosyası adı veya çalıştırılabilir programın adı olarak tanınmıyor. Bu ad veya bir yol dahil edildiyse, yolun doğru olduğunu doğrulayın ve tekrar deneyin. Dize) [], CommandNotFou ndException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek

3

Bir arka plan işi olarak çalıştırabilir ve daha sonra bu işin bitmesini bekleyebilirsiniz. Bunun gibi, böyle:

$ enablemb = Başlangıç ​​İşi {Etkin Posta Kutusu-Kimlik "$ DName" -Database "$ RData"}
Bekle-İş $ enablemb
İş-Al $ enablemb


Sağol Jason! Bunu aramaya başlayacağım ve onunla neler yapabileceğime bakacağım.
Paul Masek

Enable-posta kutusu hattımı yorumlamaya ve önerinizi değiştirmeye çalıştım. "Hatayı Posta Kutusu" terimi bir cmdlet, işlev, komut dosyası veya çalıştırılabilir programın adı olarak tanınmıyor. Bu adın yazımını denetleyin veya bir yol eklenmişse, yolun doğrulandığını doğrulayın. doğrudur ve tekrar deneyin. + CategoryInfo: ObjectNotFound: (Enable-Mailbox: String) [], Comm andNotFoundException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek


1

Neden böyle bir şey değil:

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

Bu tür komutları start-sleepilk testten sonra bir eklentiyle birlikte kullanıyorum, çünkü onsuz çok fazla işlemci döngüsü tüketene kadar. Yani benimki daha çok şuna benziyor:

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

Testin durumu hızlı bir şekilde değişecekse ne zaman endişelenmeyin start-sleep.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.