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スイッチを使用しても機能しないと思います。

回答:


90

次のStart-Sleepコマンドを使用します。

Start-Sleep -s 10

スクリプトを10秒間一時停止します。


ありがとう、スヴェン!私はこれを非常によく使うかもしれませんが、特に複数のアカウントを追加するときのために、もっと効率的なものが欲しいです。また、そもそもこの問題の性質は、Exchangeメールがアカウントを有効にするたびに時間の長さが異なるため、半分の時間で正常に機能するという事実です。
ポールマセック

5
私はExchangeを使用していないので、これに関するコマンドレットには精通していませんが、リソースが存在するかどうかをチェックし、存在しない場合は、存在するまで保留サイクルに入るコマンドを見つけようとしています。次のようなものです。while ( res-not-exist ) { Start-Sleep -s 1}この方法では、必要な場合にのみ、必要な場合にのみスクリプトを停止します。
スヴェン

うわー!うん、いい方法だと思うよ 他の誰かがスヴェンのアイデアに追加できますか?これは実行可能な方法ですか?
ポールマセック

現時点では、最初の提案を一時的に使用しています... +1 5秒に変更しましたが、これで十分と思われます。
ポールマセック

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戻って真の、許可を設定する次のステップは、実際に機能します。write-hostちょうどプログレスバーを提供することです。


うーん、すごい、sysadmin1138に感謝!あなたの状況は私の状況とまったく同じように見えるので、理論的には正常に機能するはずです。これも試してみます!
ポールマセック

@Paul私は静的な待機から始めましたが、実際に必要な待機は、Exchangeシステムが他のものでどの程度ロードされたかによって異なりました。それで、私はそれでダイナミックに行かなければなりませんでした。
sysadmin1138

@Bret Fisherと@SvenWへの私の最初の回答からわかるように、私は完全に同意します。それはまったく同じ状況です。
ポールマセック

私は今これを試していますが、先頭は変数であると想定されていますか、先頭に$がありコマンドではないはずですか?そのままでは機能しません。今のところ、「Enable-Mailbox -Identity "$ DName" -Database "$ RData"行の直前にコードを挿入しています。
Paul Masek

「Enable-Mailbox ...」の直後にも試してみましたが、同じエラーが発生しました。「「false」という用語は、コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されません。名前、またはパスが含まれていた場合、パスが正しいことを確認して再試行してくださいC:\ emailclientbasic.ps1:18 char:23 + $ mailboxExists = false <<<< + CategoryInfo:ObjectNotFound:(false:文字列)[]、CommandNotFou ndException + FullyQualifiedErrorId:CommandNotFoundException」
ポールMasek

3

バックグラウンドジョブとして実行し、そのジョブが完了するのを待つことができます。このような:

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


ジェイソンありがとう!私はこれを調べ始め、それで何ができるかを見ていきます。
ポールマセック

enable-mailbox行をコメントアウトして、推奨事項を置き換えてみました。「Enable-Mailbox」という用語は、コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されません。名前のスペルを確認するか、パスが含まれている場合は、パスを確認します正しく、もう一度試して+ CategoryInfo:ObjectNotFound:(メールボックスの有効化:文字列)[]、CommのandNotFoundException + FullyQualifiedErrorId:CommandNotFoundException」。
ポールMasek


1

次のようなものはなぜですか:

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

start-sleep最初のテストの後、このタイプのコマンドを追加で使用します。これは、do untilがコマンドなしで多くのプロセッササイクルを消費するためです。だから私のものは次のようになります:

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

テストの状態がすぐに変わる場合は、について心配する必要はありませんstart-sleep

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.