È necessario aggiungere un comando "Wait" a uno script Powershell


39

Ecco il mio codice attuale:

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

Questo codice funziona in modo impeccabile circa la metà delle volte, ma l'altra metà ottengo questo errore in 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               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

Quindi, se qualcuno potesse aiutarmi a lanciare un qualche tipo di comando wait dopo la creazione della mailbox e attendere fino a quando non viene creata la mailbox dell'utente prima che lo script disabiliti ActiveSync, ecc. Sarebbe davvero utile. Credo che il semplice utilizzo dell'opzione -wait non funzioni.

Risposte:


90

Usa il Start-Sleepcomando:

Start-Sleep -s 10

metterà in pausa lo script per 10 secondi.


Grazie Sven! Potrei benissimo usarlo, ma vorrei qualcosa di più efficiente soprattutto quando aggiungo più account. Inoltre, la natura di questo problema in primo luogo è che ci sono quantità variabili di tempo ogni volta che Exchange Mail abilita gli account, quindi il fatto che funzioni bene metà del tempo.
Paul Masek,

5
Non utilizzo Exchange, quindi non ho familiarità con i cmdlet al riguardo, ma ciò che farei è cercare di trovare un comando che controlli se la risorsa esiste e, in caso contrario, va in un ciclo di mantenimento fino a quando non esiste. Qualcosa del genere: in while ( res-not-exist ) { Start-Sleep -s 1}questo modo, si interrompe lo script solo per il tempo necessario e solo se è necessario.
Sven

Wow! Sì, sono d'accordo che sembra un ottimo modo per andare! Qualcun altro può aggiungere all'idea di Sven? È una strada fattibile?
Paul Masek,

Sto temporaneamente usando il tuo suggerimento iniziale per ora ... +1 L'ho modificato in 5 secondi e questo sembra essere sufficiente.
Paul Masek,

8

Ho dovuto gestire alcuni tempi in uno script di Exchange che ho scritto qualche tempo fa. In particolare, avevo bisogno di modificare le autorizzazioni su un gruppo di distribuzione appena creato, ma dovevo aspettare fino a quando il gruppo di distribuzione non fosse stato effettivamente creato prima di provare a 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)

Tenta solo di rimuovere l'attributo "IsValid" dalla cassetta postale (in questo esempio) come proxy per "la cassetta postale esiste". Una volta get-mailboxpermissionrestituito true, il passaggio successivo, l'impostazione di un'autorizzazione funzionerà effettivamente. Il write-hostè solo quello di fornire una barra di avanzamento.


hmm, wow, grazie sysadmin1138! Sembra che la tua situazione sia esattamente parallela alla mia, quindi teoricamente dovrebbe funzionare senza intoppi. Proverò anche questo!
Paul Masek,

@Paul Ho iniziato con le attese statiche, ma l'attesa effettiva dipendeva dal carico del sistema Exchange con altre cose. Quindi ho dovuto andare dinamico con esso, che funziona molto meglio!
sysadmin1138

Sono pienamente d'accordo, come vedresti dalle mie risposte iniziali a @Bret Fisher e @SvenW, che è esattamente la mia stessa situazione.
Paul Masek,

Sto provando questo ora, l'inizio dovrebbe essere una variabile o non dovrebbe avere $ all'inizio e dovrebbe essere un comando? Non funziona così com'è. A partire da ora ho inserito il tuo codice proprio prima della mia riga "Enable-Mailbox -Identity" $ DName "-Database" $ RData "
Paul Masek,

L'ho provato anche subito dopo "Enable-Mailbox ..." e ho ottenuto lo stesso errore, "Il termine 'false' non è riconosciuto come nome di un cmdlet, funzione, file di script o programma eseguibile. Controlla l'ortografia di il nome, o se è stato incluso un percorso, verificare che il percorso sia corretto e riprovare. In C: \ emailclientbasic.ps1: 18 char: 23 + $ mailboxExists = false <<<< + CategoryInfo: ObjectNotFound: (false: String) [], CommandNotFou ndException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek,

3

È possibile eseguirlo come processo in background e quindi attendere il completamento del processo. Come questo:

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


Grazie Jason! Inizierò a esaminare questo e vedere cosa posso farci.
Paul Masek,

Ho provato a commentare la mia riga di abilitazione-cassetta postale e a sostituire il tuo consiglio. Ho ricevuto questo errore, "Il termine 'Enable-Mailbox' non è riconosciuto come nome di un cmdlet, funzione, file di script o programma eseguibile. Controllare l'ortografia del nome o se è stato incluso un percorso, verificare che il percorso è corretto e riprovare. + CategoryInfo: ObjectNotFound: (Enable-Mailbox: String) [], Comm andNotFoundException + FullyQualifiedErrorId: CommandNotFoundException "
Paul Masek


1

Perché non qualcosa del genere:

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

Uso questo tipo di comando con un'aggiunta start-sleepdopo il test iniziale perché lo faccio fino a quando non mangia molti cicli del processore senza di esso. Quindi il mio assomiglia di più a questo:

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

Se il test cambierà rapidamente stato quando non ti preoccupare di start-sleep.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.