จำเป็นต้องเพิ่มคำสั่ง“ รอ” ลงในสคริปต์ 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

ดังนั้นหากใครสามารถช่วยฉันโยนคำสั่ง wait บางประเภทหลังจากที่สร้างกล่องจดหมายและรอจนกว่ากล่องจดหมายของผู้ใช้จะถูกสร้างขึ้นก่อนที่สคริปต์จะปิดการใช้งาน ActiveSync ฯลฯ มันจะมีประโยชน์จริง ๆ ฉันเชื่อว่าการใช้สวิตช์รอไม่ได้ผล

คำตอบ:


90

ใช้Start-Sleepคำสั่ง:

Start-Sleep -s 10

จะหยุดสคริปต์ชั่วคราวเป็นเวลา 10 วินาที


ขอบคุณสเวน! ฉันอาจใช้สิ่งนี้ได้ดี แต่ฉันต้องการสิ่งที่มีประสิทธิภาพมากกว่าโดยเฉพาะเมื่อฉันเพิ่มหลายบัญชี นอกจากนี้ลักษณะของปัญหานี้ในตอนแรกคือมีจำนวนครั้งที่แตกต่างกันในแต่ละครั้งที่จดหมาย Exchange เปิดใช้งานบัญชีดังนั้นความจริงที่ว่ามันใช้งานได้ดีครึ่งหนึ่งของเวลา
Paul Masek

5
ฉันไม่ได้ใช้ Exchange ดังนั้นฉันไม่คุ้นเคยกับ cmdlets เกี่ยวกับสิ่งนี้ แต่สิ่งที่ฉันจะทำคือพยายามค้นหาคำสั่งที่ตรวจสอบว่ามีทรัพยากรอยู่หรือไม่และจะไม่เข้าสู่วงจรการถือจนกว่าจะมีอยู่ บางสิ่งเช่นนี้: while ( res-not-exist ) { Start-Sleep -s 1}ด้วยวิธีนี้คุณจะหยุดสคริปต์ได้นานเท่าที่จำเป็นและเฉพาะเมื่อจำเป็นเท่านั้น
สเวน

ว้าว! ใช่ฉันเห็นด้วยว่าฟังดูเป็นวิธีที่ยอดเยี่ยมมาก! ใครสามารถเพิ่มความคิดของ Sven ได้บ้าง นี่เป็นวิธีที่เป็นไปได้ไหม?
Paul Masek

ฉันใช้คำแนะนำเริ่มต้นชั่วคราวแล้วในตอนนี้ ... +1 ฉันเปลี่ยนเป็น 5 วินาทีและดูเหมือนว่าจะเพียงพอ
Paul Masek

8

ฉันต้องจัดการกับช่วงเวลาในสคริปต์การแลกเปลี่ยนที่ฉันเขียนไปสักพักแล้ว โดยเฉพาะฉันต้องการแก้ไขสิทธิ์ในกลุ่มการแจกจ่ายที่สร้างขึ้นใหม่ แต่จำเป็นต้องรอจนกว่ากลุ่มการแจกจ่ายจะถูกสร้างขึ้นจริงก่อนที่จะพยายามแก้ไข

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ส่งคืนจริงขั้นตอนถัดไปการตั้งค่าการอนุญาตจะทำงานจริง write-hostเป็นเพียงเพื่อให้แถบความคืบหน้า


อืมว้าวขอบคุณ sysadmin1138! ดูเหมือนว่าสถานการณ์ของคุณจะสอดคล้องกับของฉันอย่างแน่นอนดังนั้นในทางทฤษฎีควรใช้ w / oa hitch ฉันจะลองแบบนี้เช่นกัน!
Paul Masek

@ พอลฉันเริ่มด้วยการรอคอยแบบสแตติก แต่การรอคอยที่แท้จริงต้องขึ้นอยู่กับว่าระบบ Exchange โหลดได้อย่างไรกับสิ่งอื่น ๆ ดังนั้นฉันต้องไปแบบไดนามิกกับมันซึ่งได้ผลดีกว่ามาก!
sysadmin1138

ฉันเห็นด้วยอย่างเต็มที่ดังที่คุณเห็นจากการตอบกลับครั้งแรกของฉันต่อ @Bret Fisher และ @SvenW นั่นเป็นสถานการณ์เดียวกันของฉัน
Paul Masek

ฉันกำลังลองตอนนี้การเริ่มต้นควรจะเป็นตัวแปรหรือไม่ควรมี $ ที่จุดเริ่มต้นและเป็นคำสั่งหรือไม่? มันไม่ทำงานเหมือนที่เป็นอยู่ ณ ตอนนี้ฉันได้ใส่รหัสของคุณไว้ตรงหน้า "Enable-Mailbox -Identity" $ DName "- ฐานข้อมูล" $ RData "บรรทัด
Paul Masek

ฉันลองมันทันทีหลังจาก "Enable-Mailbox ... " และได้รับข้อผิดพลาดเดียวกันนี้ "คำว่า" false "ไม่ได้รับการยอมรับว่าเป็นชื่อของ cmdlet, ฟังก์ชั่น, สคริปต์ fi หรือโปรแกรมที่ทำงานได้ตรวจสอบการสะกดคำ ชื่อหรือถ้าเส้นทางถูก inclu ded ตรวจสอบว่าเส้นทางนั้นถูกต้องและลองอีกครั้งที่ C: \ emailclientbasic.ps1: 18 ถ่าน: 23 + $ mailboxExists = false <<<< + CategoryInfo: ObjectNotFound: (false: สตริง) [], CommandNotFou ndException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek

3

คุณสามารถรันมันเป็นงานพื้นหลังแล้วรอให้งานนั้นเสร็จ แบบนี้:

$ enablemb = งานเริ่มต้น {เปิดใช้งาน - กล่องจดหมาย - ข้อมูล "$ DName" - ฐานข้อมูล "$ RData"}
รองาน $ enablemb
รับงาน $ enablemb


ขอบคุณเจสัน! ฉันจะเริ่มดูสิ่งนี้และดูว่าฉันสามารถทำอะไรได้บ้าง
Paul Masek

ฉันพยายามแสดงความคิดเห็นในบรรทัดกล่องจดหมายเปิดใช้งานของฉันและแทนที่คำแนะนำของคุณ ฉันได้รับข้อผิดพลาดนี้ "คำว่า 'Enable-Mailbox' ไม่ได้รับการยอมรับว่าเป็นชื่อของ cmdlet, ฟังก์ชั่น, ไฟล์สคริปต์หรือโปรแกรมที่ทำงานได้ตรวจสอบการสะกดชื่อหรือตรวจสอบว่ามีการรวมเส้นทางหรือไม่ ถูกต้องแล้วลองใหม่อีกครั้ง + CategoryInfo: ObjectNotFound: (เปิดใช้งานกล่องจดหมาย: สตริง) [], Comm และNotFoundException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek

1

Start-Sleep = รอ x วินาที

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


ขอบคุณ Bret แต่อย่างที่ฉันบอก Sven ฉันกำลังมองหาคำสั่งที่ฉลาดกว่านี้เพื่อดำเนินการต่อเมื่อบัญชีเปิดใช้งานจดหมาย เวลารอคอยแบบคงที่จะไม่ช่วยในสถานการณ์ของฉัน
Paul Masek

1

ทำไมไม่ชอบ:

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

ฉันใช้คำสั่งประเภทนี้พร้อมกับ addtional start-sleepหลังจากการทดสอบเริ่มต้นเพราะทำจนกว่าจะกินวงจรตัวประมวลผลจำนวนมากโดยไม่มีมัน ดังนั้นหน้าตาของฉันจะเป็นดังนี้:

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

start-sleepหากการทดสอบเป็นไปรัฐการเปลี่ยนแปลงอย่างรวดเร็วเมื่อไม่ต้องกังวลเกี่ยวกับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.