Perlu menambahkan perintah "Tunggu" ke skrip Powershell

39

Ini kode saya saat ini:

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

Kode ini berfungsi dengan sempurna sekitar separuh waktu, tetapi separuh lainnya saya mendapatkan kesalahan ini sebagai balasan:

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

Jadi kalau ada yang bisa membantu saya melempar semacam perintah tunggu setelah kotak surat dibuat dan tunggu sampai kotak pesan pengguna dibuat sebelum skrip menonaktifkan ActiveSync, dll. Itu akan sangat membantu. Saya percaya bahwa hanya menggunakan saklar tunggu tidak bekerja.

Paul Masek
sumber

Jawaban:

90

Gunakan Start-Sleepperintah:

Start-Sleep -s 10

akan menjeda skrip selama 10 detik.

Sven
sumber
Terima kasih Sven! Saya mungkin sangat baik menggunakan ini, tetapi saya ingin sesuatu yang lebih efisien terutama ketika saya menambahkan beberapa akun. Selain itu, sifat dari masalah ini pada awalnya adalah bahwa terdapat jumlah waktu yang bervariasi setiap kali Exchange mail memungkinkan akun, karenanya fakta bahwa ia berfungsi dengan baik separuh waktu.
Paul Masek
5
Saya tidak menggunakan Exchange, jadi saya tidak terbiasa dengan cmdlet mengenai hal ini, tetapi apa yang akan saya lakukan adalah mencoba menemukan perintah yang memeriksa apakah sumber daya ada dan jika tidak, masuk ke siklus holding sampai ada. Sesuatu seperti ini: while ( res-not-exist ) { Start-Sleep -s 1}Dengan cara ini, Anda menghentikan skrip hanya selama diperlukan dan hanya jika diperlukan.
Sven
Wow! Ya saya setuju itu terdengar seperti cara yang bagus untuk pergi! Adakah yang bisa menambah ide Sven? Apakah ini cara yang layak untuk dilakukan?
Paul Masek
Saya sementara menggunakan saran awal Anda untuk saat ini ... +1 Saya mengubahnya menjadi 5 detik dan itu tampaknya sudah cukup.
Paul Masek
8

Saya harus berurusan dengan beberapa waktu dalam skrip Exchange yang saya tulis beberapa waktu lalu. Secara khusus, saya perlu memodifikasi izin pada grup distribusi yang baru dibuat, tetapi perlu menunggu sampai grup distribusi benar-benar dibuat sebelum mencoba untuk memodifikasinya.

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

Itu hanya mencoba untuk mendapatkan atribut "IsValid" dari kotak surat (dalam contoh ini) sebagai proxy untuk "kotak surat ada". Setelah get-mailboxpermissionmengembalikan true, langkah berikutnya, mengatur izin sebenarnya akan berfungsi. The write-hosthanya untuk memberikan progress bar.

sysadmin1138
sumber
hmm, wow, terima kasih sysadmin1138! Sepertinya situasi Anda sejajar dengan saya, jadi seharusnya secara teori bekerja tanpa hambatan. Saya akan mencoba ini juga!
Paul Masek
@ Paul Saya mulai dengan menunggu statis, tetapi menunggu yang sebenarnya tergantung pada seberapa dimuat sistem Exchange dengan hal-hal lain. Jadi saya harus dinamis dengan itu, yang bekerja jauh lebih baik!
sysadmin1138
Saya sepenuhnya setuju, seperti yang akan Anda lihat dari tanggapan awal saya terhadap @Bret Fisher dan @SvenW, itulah situasi yang sama persis dengan saya.
Paul Masek
Saya sedang mencoba ini sekarang, apakah awal seharusnya menjadi variabel atau seharusnya tidak memiliki $ di awal dan menjadi perintah? Ini tidak berfungsi sebagaimana mestinya. Sampai sekarang saya memiliki kode Anda dimasukkan tepat sebelum saya "Aktifkan-Mailbox -Identity" $ DName "-Database" $ RData "baris.
Paul Masek
Saya juga mencobanya tepat setelah "Enable-Mailbox ..." dan mendapatkan kesalahan yang sama, "Istilah 'false' tidak dikenali sebagai nama cmdlet, fungsi, file skrip, atau program yang dapat dioperasikan. Periksa ejaan dari nama, atau jika suatu jalur dimasukkan, verifikasi bahwa jalur itu benar dan coba lagi. Di C: \ emailclientbasic.ps1: 18 char: 23 + $ mailboxExists = false <<<< + CategoryInfo: ObjectNotFound: (false: String) [], CommandNotFou ndException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek
3

Anda bisa menjalankannya sebagai pekerjaan latar belakang dan kemudian menunggu pekerjaan itu selesai. Seperti ini:

$ enablemb = Start-Job {Enable-Mailbox -Identity "$ DName" -Database "$ RData"}
Tunggu-Job $ enablemb
Menerima-Job $ enablemb

Jason Berg
sumber
Jason terima kasih! Saya akan mulai melihat ke dalam ini dan melihat apa yang bisa saya lakukan dengannya.
Paul Masek
Saya mencoba mengomentari saluran kotak surat saya yang aktif dan mengganti rekomendasi Anda. Saya mendapatkan kesalahan ini, "Istilah 'Enable-Mailbox' tidak dikenali sebagai nama cmdlet, fungsi, file skrip, atau program yang bisa dijalankan. Periksa ejaan nama, atau jika jalur dimasukkan, verifikasi bahwa jalur sudah benar dan coba lagi. + CategoryInfo: ObjectNotFound: (Enable-Mailbox: String) [], Comm andNotFoundException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek
1

Start-Sleep = tunggu x detik

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

Bret Fisher
sumber
Terima kasih Bret, tetapi seperti yang saya katakan pada Sven, saya mencari perintah yang lebih cerdas untuk benar-benar melanjutkan ketika akun telah diaktifkan melalui email. Waktu tunggu statis tidak akan membantu dalam situasi saya.
Paul Masek
1

Mengapa bukan sesuatu seperti:

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

Saya menggunakan jenis perintah ini dengan tambahan start-sleepsetelah tes awal karena lakukan sampai makan banyak siklus prosesor tanpa itu. Jadi milikku lebih seperti ini:

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

Jika tes akan berubah keadaan dengan cepat saat tidak khawatir tentang start-sleep.

Sean
sumber