Precisa adicionar um comando "Wait" a um script do Powershell

39

Aqui está 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 exchange@xyz.com

Esse código funciona perfeitamente na metade do tempo, mas na outra metade recebo esse erro em troca:

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 pudesse me ajudar a executar 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 o simples uso da opção -wait não funcione.

Paul Masek
fonte

Respostas:

90

Use o Start-Sleepcomando:

Start-Sleep -s 10

pausará o script por 10 segundos.

Sven
fonte
Obrigado Sven! Eu poderia muito bem usar isso, mas gostaria de algo mais eficiente, especialmente quando adiciono várias contas. Além disso, a natureza desse problema, em primeiro lugar, é que há quantidades variáveis ​​de tempo sempre que o correio do Exchange habilita contas, portanto, o fato de ele funcionar bem na metade do tempo.
Paul Masek
5
Como não uso o Exchange, não estou familiarizado com os cmdlets relacionados a isso, mas o que eu faria é tentar encontrar um comando que verifique se o recurso existe e, se não existir, entre em um ciclo de retenção até que ele exista. Algo assim: while ( res-not-exist ) { Start-Sleep -s 1}dessa maneira, você interrompe o script apenas pelo tempo que for necessário e somente se for necessário.
Sven
Uau! Sim, eu concordo que parece um ótimo caminho a percorrer! Alguém mais pode acrescentar à ideia de Sven? Esse é um caminho viável?
Paul Masek
Estou temporariamente usando sua sugestão inicial por enquanto ... +1 Alterei para 5 segundos e isso parece suficiente.
Paul Masek
8

Eu tive que lidar com algum tempo em um script do Exchange que escrevi há um tempo atrás. Especificamente, eu precisava modificar as 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)

Apenas tenta obter o atributo "IsValid" da caixa de correio (neste exemplo) como um proxy para "caixa de correio existe". Depois que get-mailboxpermissionretornar true, o próximo passo, definir uma permissão realmente funcionará. O write-hosté apenas para fornecer uma barra de progresso.

sysadmin1138
fonte
hmm, uau, obrigado sysadmin1138! Parece que sua situação é paralela à minha exatamente, portanto, teoricamente, deveria funcionar sem problemas. Vou tentar isso também!
Paul Masek
@Paul Comecei com esperas estáticas, mas a espera real dependia de quão carregado o sistema Exchange estava com outras coisas. Então eu tive que ir dinâmico, o que funciona muito melhor!
sysadmin1138
Concordo plenamente, como você veria nas minhas respostas iniciais a @Bret Fisher e @SvenW, essa é exatamente a minha mesma situação.
Paul Masek
Estou tentando isso agora, o começo deveria ser uma variável ou não deveria ter o $ no começo e ser um comando? Não está funcionando como está. A partir de agora eu tenho o código inserido logo antes de minha linha "Enable-Mailbox -Identity '$ dname' -Database '$ RDATA'.
Paul Masek
Também tentei logo depois de "Enable-Mailbox ..." e recebi o mesmo erro: "O termo 'false' não é reconhecido como o nome de um cmdlet, função, arquivo de script ou programa operável. Verifique a ortografia de o nome ou se um caminho foi incluído, verifique se o caminho está correto e tente novamente.Em C: \ emailclientbasic.ps1: 18 char: 23 + $ mailboxExists = false <<<< + CategoryInfo: ObjectNotFound: (false: String) [], CommandNotFou ndException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek
3

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

$ enablemb = Iniciar trabalho {Enable-Mailbox -Identity "$ DName" -Database "$ RData"}
Trabalho em espera $ enablemb
Receive-Job $ enablemb

Jason Berg
fonte
Obrigado Jason! Vou começar a analisar isso e ver o que posso fazer com isso.
Paul Masek
Tentei comentar minha linha de caixa de correio de ativação e substituir sua recomendação. Eu recebi este erro: "O termo 'Habilitar Caixa de Correio' não é reconhecido como o nome de um cmdlet, função, arquivo de script ou programa operável. Verifique a ortografia do nome ou, se um caminho foi incluído, verifique se o caminho está correto e tente novamente + CategoryInfo: ObjectNotFound: (Enable-Mailbox: string) [], Comm andNotFoundException + FullyQualifiedErrorId: CommandNotFoundException".
Paul Masek
1

Start-Sleep = espera x segundos

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

Bret Fisher
fonte
Obrigado Bret, mas, como disse a Sven, estou procurando um comando mais inteligente para prosseguir quando a conta tiver sido habilitada para email. Um tempo de espera estático não ajudará na minha situação.
Paul Masek
1

Por que não algo como:

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

Eu uso este tipo de comando com um addtional start-sleepapós o teste inicial, porque fazer até come um monte de ciclos de processador sem ele. Então o meu se 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.

Sean
fonte