Necesita agregar un comando "Esperar" a un script de Powershell

39

Aquí está mi código actual:

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

Este código funciona sin problemas aproximadamente la mitad del tiempo, pero la otra mitad recibo este error a cambio:

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

Entonces, si alguien pudiera ayudarme a incluir algún tipo de comando de espera después de crear el buzón y esperar hasta que se cree el buzón del usuario antes de que el script desactive ActiveSync, etc., sería realmente útil. Creo que simplemente usando el modificador -wait no funciona.

Paul Masek
fuente

Respuestas:

90

Usa el Start-Sleepcomando:

Start-Sleep -s 10

pausará la secuencia de comandos durante 10 segundos.

Sven
fuente
Gracias Sven! Muy bien podría usar esto, pero me gustaría algo más eficiente, especialmente cuando agrego varias cuentas. Además, la naturaleza de este problema en primer lugar es que cada vez que Exchange Mail habilita las cuentas, hay diferentes cantidades de tiempo, de ahí el hecho de que funciona bien la mitad del tiempo.
Paul Masek
55
No uso Exchange, por lo que no estoy familiarizado con los cmdlets con respecto a esto, pero lo que haría sería intentar encontrar un comando que verifique si el recurso existe y, si no, entra en un ciclo de espera hasta que exista. Algo como esto: de while ( res-not-exist ) { Start-Sleep -s 1}esta manera, detiene el script solo mientras sea necesario y solo si es necesario.
Sven
¡Guauu! Sí, ¡estoy de acuerdo en que suena como un gran camino a seguir! ¿Alguien más puede agregar a la idea de Sven? ¿Es este un camino factible?
Paul Masek
Estoy usando temporalmente su sugerencia inicial por ahora ... +1 Lo cambié a 5 segundos y eso parece ser suficiente.
Paul Masek
8

Tuve que lidiar con algún momento en un script de Exchange que escribí hace un tiempo. Específicamente, necesitaba modificar los permisos en un grupo de distribución recién creado, pero tenía que esperar hasta que el grupo de distribución se creara antes de intentar modificarlo.

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

Simplemente intenta quitar el atributo "IsValid" del buzón (en este ejemplo) como un proxy para "existe un buzón". Una vez que get-mailboxpermissiondevuelve verdadero, el siguiente paso, establecer un permiso realmente funcionará. El write-hostes solo para proporcionar una barra de progreso.

sysadmin1138
fuente
hmm, wow, gracias sysadmin1138! Parece que su situación es paralela a la mía exactamente, por lo que teóricamente debería funcionar sin problemas. ¡Intentaré esto también!
Paul Masek
@Paul Comencé con esperas estáticas, pero la espera real necesaria dependía de la carga del sistema de Exchange con otras cosas. Así que tuve que ser dinámico, ¡lo que funciona mucho mejor!
sysadmin1138
Estoy totalmente de acuerdo, como verían en mis respuestas iniciales a @Bret Fisher y @SvenW, esa es mi misma situación exactamente.
Paul Masek
Estoy intentando esto ahora, ¿se supone que el principio es una variable o no debería tener el $ al principio y ser un comando? No está funcionando como está. A partir de ahora tengo su código insertado justo antes de mi línea "Enable-Mailbox -Identity" $ DName "-Database" $ RData ".
Paul Masek
También lo probé justo después de "Enable-Mailbox ..." y obtuve el mismo error: "El término 'falso' no se reconoce como el nombre de un cmdlet, función, archivo de script o programa operable. Verifique la ortografía de el nombre, o si se incluyó una ruta, verifique que la ruta sea correcta e inténtelo de nuevo. String) [], CommandNotFou ndException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek
3

Puede ejecutarlo como un trabajo en segundo plano y luego esperar a que termine ese trabajo. Me gusta esto:

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

Jason Berg
fuente
Gracias Jason! Voy a comenzar a investigar esto y ver qué puedo hacer con él.
Paul Masek
Intenté comentar mi línea de buzón de habilitación y sustituir su recomendación. Recibí este error, "El término 'Enable-Mailbox' no se reconoce como el nombre de un cmdlet, función, archivo de script o programa operable. Verifique la ortografía del nombre, o si se incluyó una ruta, verifique que la ruta es correcto e intente nuevamente. + CategoryInfo: ObjectNotFound: (Enable-Mailbox: String) [], Comm andNotFoundException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek
1

Start-Sleep = esperar x segundos

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

Bret Fisher
fuente
Gracias Bret, pero como le dije a Sven, estoy buscando un comando más inteligente para proceder cuando la cuenta ha sido habilitada para correo. Un tiempo de espera estático no ayudará en mi situación.
Paul Masek
1

¿Por qué no algo como:

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

Utilizo este tipo de comando con un adicional start-sleepdespués de la prueba inicial porque hasta que come muchos ciclos de procesador sin él. Entonces el mío se parece más a esto:

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

Si la prueba va a cambiar de estado rápidamente cuando no se preocupe por el start-sleep.

Sean
fuente