Precisa adicionar um comando “Wait” a um script do Powershell

36

Aqui está o meu código atual:

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 [email protected]

Esse código funciona sem falhas na metade do tempo, mas na outra metade eu recebo esse erro em retorno:

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

Portanto, se alguém puder me ajudar a enviar algum tipo de comando de espera após a criação da caixa de correio e aguardar até que a caixa de correio do usuário seja criada antes que o script desative o ActiveSync, etc, seria realmente útil. Acredito que simplesmente usar o interruptor -wait não funciona.

    
por Paul Masek 17.05.2011 / 16:42

5 respostas

77

Use o comando Start-Sleep :

Start-Sleep -s 10

fará uma pausa no script por 10 segundos.

    
por 17.05.2011 / 16:45
8

Eu tive que lidar com algum tempo em um script do Exchange que escrevi há algum tempo. Especificamente, eu precisava modificar permissões em um grupo de distribuição recém-criado, mas precisava esperar até que o grupo de distribuição fosse realmente criado antes de tentar modificá-lo.

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

Ele apenas tenta desativar o atributo "IsValid" da caixa de correio (neste exemplo) como um proxy para "caixa de correio existe". Uma vez que get-mailboxpermission retorne true, o próximo passo, a configuração de uma permissão, realmente funcionará. O write-host é apenas para fornecer uma barra de progresso.

    
por 17.05.2011 / 19:51
3

Você pode executá-lo como um trabalho em segundo plano e aguardar a conclusão do trabalho. Assim:

$enablemb = Start-Job { Enable-Mailbox -Identity "$DName" -Database "$RData" }
Wait-Job $enablemb
Receive-Job $enablemb

    
por 17.05.2011 / 18:03
1

Iniciar-dormir = espera x segundos

link

    
por 17.05.2011 / 16:48
1

Por que não algo como:

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

Eu uso esse tipo de comando com um start-sleep adicional após o teste inicial porque faço até consumir muitos ciclos de processador sem ele. Então o meu parece mais com isso:

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

Se o teste vai mudar de estado rapidamente quando não se preocupar com o start-sleep .

    
por 25.02.2012 / 03:18