需要在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

因此,如果有人可以在创建邮箱后帮助我发出某种等待命令,并等到用户的邮箱创建之后再脚本禁用ActiveSync等,这将非常有用。我相信,仅使用-wait开关是行不通的。

Answers:


90

使用Start-Sleep命令:

Start-Sleep -s 10

将暂停脚本10秒钟。


谢谢斯文!我很可能会用到它,但是我想要更高效的方法,尤其是在添加多个帐户时。同样,此问题的本质是,每次Exchange邮件启用帐户时,时间的长短不一,因此,它在一半时间内正常工作的事实。
Paul Masek

5
我不使用Exchange,所以我对此不熟悉cmdlet,但是我将尝试找到一个命令来检查资源是否存在,如果不存在,则进入保持周期直到存在。这样的事情:while ( res-not-exist ) { Start-Sleep -s 1}这样,您仅在必要时和仅在必要时才停止脚本。
斯文

哇!是的,我同意这听起来是个不错的选择!有人能补充Sven的想法吗?这是可行的方法吗?
Paul Masek

我现在暂时使用您的最初建议... +1我确实将其更改为5秒,这似乎足够了。
Paul Masek

8

我不得不在前一段时间编写的Exchange脚本中处理一些时间安排。具体来说,我需要修改对新创建的通讯组的权限,但需要等到实际创建通讯组后才能尝试对其进行修改。

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返回true,下一步实际上就是设置权限。该write-host仅仅是提供一个进度条。


嗯,哇,谢谢sysadmin1138!看来您的情况与我的情况完全相同,因此从理论上讲,它应该能正常工作。我也会尝试这个!
Paul Masek

@Paul我从静态等待开始,但是实际需要的等待取决于Exchange系统加载其他东西的方式。因此,我不得不动态处理它,效果更好!
sysadmin1138

从您对@Bret Fisher和@SvenW的最初回复中可以看出,我完全同意,这与我的情况完全相同。
保罗·马西克

我现在正在尝试此操作,应该以开头作为变量还是应该以$作为开头而不是命令?它不能按原样工作。截至现在,我有你的代码我的“启用邮箱-Identity‘$ DNAME’-Database‘$ RDATA’行权前插入
保罗马塞克

我也在“ Enable-Mailbox ...”之后立即尝试了此操作,并得到了相同的错误,“术语'false'未被识别为cmdlet,函数,脚本文件或可操作程序的名称。请检查其拼写。名称,或者是否包含路径,请验证路径是否正确,然后重试。在C:\ emailclientbasic.ps1:18 char:23 + $ mailboxExists = false <<<< + CategoryInfo:ObjectNotFound:(false:字符串)[],CommandNotFou ndException + FullyQualifiedErrorId:CommandNotFoundException”
保罗·

3

您可以将其作为后台作业运行,然后等待该作业完成。像这样:

$ enablemb =开始作业{启用邮箱-身份“ $ DName”-数据库“ $ RData”}
等待作业$ enablemb
接收作业$ enablemb


谢谢杰森!我将开始研究这个问题,看看我能做些什么。
Paul Masek

我尝试注释掉我的启用邮箱行并替换您的建议。我收到此错误,“术语'Enable-Mailbox'不被识别为cmdlet,函数,脚本文件或可运行程序的名称。请检查名称的拼写,或者是否包含路径,请验证路径是正确的,然后重试。+ CategoryInfo:ObjectNotFound :(启用邮箱:字符串)[],Comm和NotFoundException + FullyQualifiedErrorId:CommandNotFoundException”
Paul


1

为什么不这样:

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

start-sleep在初始测试之后,我将这种类型的命令与其他命令一起使用,因为在没有它之前,它会吃掉很多处理器周期。所以我的看起来更像这样:

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

如果测试即将迅速改变状态,则不必担心start-sleep

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.