Cần thêm một lệnh Wait Wait vào kịch bản Powershell


39

Đây là mã hiện tại của tôi:

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

Mã này hoạt động hoàn hảo khoảng một nửa thời gian, nhưng nửa còn lại tôi nhận được lỗi này:

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

Vì vậy, nếu bất cứ ai có thể giúp tôi ném một số loại lệnh chờ sau khi hộp thư được tạo và đợi cho đến khi hộp thư của người dùng được tạo trước khi tập lệnh vô hiệu hóa ActiveSync, v.v ... nó sẽ thực sự hữu ích. Tôi tin rằng chỉ đơn giản là sử dụng công tắc -wait không hoạt động.

Câu trả lời:


90

Sử dụng Start-Sleeplệnh:

Start-Sleep -s 10

sẽ tạm dừng tập lệnh trong 10 giây.


Cảm ơn Sven! Tôi rất có thể sử dụng điều này, nhưng tôi muốn một cái gì đó hiệu quả hơn đặc biệt là khi tôi thêm nhiều tài khoản. Ngoài ra, bản chất của vấn đề này ở nơi đầu tiên là có số lượng thời gian khác nhau mỗi lần Exchange mail cho phép các tài khoản, do đó thực tế là nó hoạt động tốt một nửa thời gian.
Paul Masek

5
Tôi không sử dụng Exchange, vì vậy tôi không quen với các lệnh ghép ngắn về vấn đề này, nhưng điều tôi sẽ làm là cố gắng tìm một lệnh kiểm tra xem tài nguyên có tồn tại hay không, nếu không, sẽ đi vào chu kỳ giữ cho đến khi nó tồn tại. Một cái gì đó như thế này: while ( res-not-exist ) { Start-Sleep -s 1}Bằng cách này, bạn chỉ dừng tập lệnh miễn là cần thiết và chỉ khi cần thiết.
Sven

Ồ Vâng, tôi đồng ý rằng âm thanh như một cách tuyệt vời để đi! Bất cứ ai khác có thể thêm vào ý tưởng của Sven? Đây có phải là một cách khả thi để đi?
Paul Masek

Tôi hiện đang tạm thời sử dụng đề xuất ban đầu của bạn ... +1 Tôi đã thay đổi nó thành 5 giây và điều đó dường như là đủ.
Paul Masek

8

Tôi đã phải đối phó với một số thời điểm trong một kịch bản trao đổi tôi đã viết cách đây một thời gian. Cụ thể, tôi cần sửa đổi các quyền trên một nhóm phân phối mới được tạo, nhưng cần phải đợi cho đến khi nhóm phân phối thực sự được tạo trước khi thử sửa đổi nó.

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

Nó chỉ cố gắng loại bỏ thuộc tính "IsValid" khỏi hộp thư (trong ví dụ này) làm proxy cho "hộp thư tồn tại". Khi get-mailboxpermissiontrả về đúng, bước tiếp theo, thiết lập quyền sẽ thực sự hoạt động. Đây write-hostchỉ là để cung cấp một thanh tiến trình.


hmm, wow, cảm ơn sysadmin1138! Có vẻ như tình huống của bạn tương tự như tôi, vì vậy về mặt lý thuyết nó sẽ hoạt động tốt. Tôi cũng sẽ thử điều này!
Paul Masek

@Paul Tôi bắt đầu với sự chờ đợi tĩnh, nhưng sự chờ đợi thực sự cần phụ thuộc vào mức độ tải của hệ thống Exchange với những thứ khác. Vì vậy, tôi đã phải năng động với nó, hoạt động tốt hơn nhiều!
sysadmin1138

Tôi hoàn toàn đồng ý, như bạn thấy từ những phản hồi ban đầu của tôi đối với @Bret Fisher và @SvenW, đó chính là tình huống tương tự của tôi.
Paul Masek

Bây giờ tôi đang thử điều này, sự khởi đầu được coi là một biến hay nó không nên có $ ở đầu và là một lệnh? Nó không hoạt động như vậy. Kể từ bây giờ, tôi đã chèn mã của bạn ngay trước dòng "Enable-Mailbox -Identity" $ DName "-Database" $ RData ".
Paul Masek

Tôi cũng đã thử nó ngay sau "Enable-Mailbox ..." và gặp lỗi tương tự, "Thuật ngữ 'false' không được nhận dạng là tên của lệnh ghép ngắn, hàm, tập lệnh hoặc chương trình có thể thao tác. Kiểm tra chính tả của Tên hoặc nếu một đường dẫn là inclu dep, hãy xác minh rằng đường dẫn đó là chính xác và thử lại. Tại C: \ emailclientbasic.ps1: 18 char: 23 + $ hộp thưExists = false <<<< + CategoryInfo: ObjectNotFound: (false: Chuỗi) [], CommandNotFou ndException + FullQualifiedErrorId: CommandNotFoundException "
Paul Masek

3

Bạn có thể chạy nó như một công việc nền và sau đó chờ công việc đó kết thúc. Như thế này:

$ enablemb = Start-Job {Enable-Mailbox -Identity "$ DName" -Database "$ RData"}
Wait-job $ enablemb
Nhận-job $ enablemb


Cảm ơn Jason! Tôi sẽ bắt đầu xem xét điều này và xem những gì tôi có thể làm với nó.
Paul Masek

Tôi đã cố gắng nhận xét dòng hộp thư cho phép của tôi và thay thế đề xuất của bạn. Tôi đã gặp lỗi này, "Thuật ngữ 'Kích hoạt Hộp thư' không được nhận dạng là tên của lệnh ghép ngắn, hàm, tệp tập lệnh hoặc chương trình có thể thao tác. Kiểm tra chính tả của tên hoặc nếu có một đường dẫn, hãy xác minh rằng đường dẫn là đúng và thử lại + CategoryInfo: ObjectNotFound: (Enable-Mailbox: string) [], Comm andNotFoundException + FullyQualifiedErrorId: CommandNotFoundException".
Paul Masek


1

Tại sao không phải là một cái gì đó như:

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

Tôi sử dụng loại lệnh này với một lệnh bổ sung start-sleepsau thử nghiệm ban đầu bởi vì làm cho đến khi ăn rất nhiều chu kỳ bộ xử lý mà không có nó. Vì vậy, cái của tôi trông giống như thế này:

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

Nếu thử nghiệm sẽ thay đổi trạng thái nhanh chóng khi không lo lắng về start-sleep.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.