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

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

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.

Jawaban:


90

Gunakan Start-Sleepperintah:

Start-Sleep -s 10

akan menjeda skrip selama 10 detik.


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.


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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.