Behandeln von Timeouts in PowerShell Skripten DO UNTIL

The estimated reading time 2 minutes

Hallo zusammen,
wenn ihr diesen Artikel gefunden habt, kämpft ihr vermutlich gerade mit der Trägheit der Microsoft Cloud (oder auch irgendwelchen anderen Produkten) und euer Skript bricht ab, weil das Objekt noch nicht komplett angelegt ist.
Leider ist das immer wieder ein Problem beim Automatisieren, speziell in der Microsoft Cloud. Also habe ich mal etwas Zeit investiert und mir einen kleinen Workaround überlegt. Dieser ist nicht schwierig, kann aber doch vielleicht dem ein oder anderen helfen.

Beispiel 1 Abprüfen bis du schwarz wirst

Schauen wir uns meinen ersten Versuch an um eine Sharepoint URL (mit der ExchangeOnline PowerShell) eines neu erstellen Teams zu bekommen. Ich habe habe hier die Looping Funktion „DO UNTIL“ verwendet (eventuell nicht die beste Methode, da hier eben kein Abbruch und kein Timeout hinterlegt ist).

 $teaminfo = New-Team -DisplayName Testteam -Owner me@demo.it-koehler.com
$teamgroupid = ($teaminfo).GroupId
#setting counter $i to zero
$i = 0
    do{
      #do this cmdlet until it gives a result
      $teamspurl = (Get-UnifiedGroup |Where-Object {$_.ExternalDirectoryObjectId -eq "$teamgroupid"}) | Select-Object SharePointSiteUrl -ExpandProperty SharePointSiteUrl
      if(!$teamspurl){
        #wait 5 seconds for the next try
        Start-Sleep -Seconds 5
        $i++
        Write-host "waiting for exchange online..."
      }
    }
    Until ($teamspurl)
    #count the and calculate the consumed time
    $urltime = [int]$i *5
    Write-Host "Sharepoint Online took $urltime seconds to respond and find the URL."

Natürlich lassen sich die Zeitparameter anpassen. Ich habe für mich 5 Sekunden definiert. Solange wartet die Schleife zum nächsten Versuch. Wird dieser Wert abgeändert, muss auch der untere Wert zur Berechnung der benötigten Zeit abgeändert werden.

Beispiel 2 warten bis ein Timeout das ganze beendet

Das zweite Beispiel ist nahezu das gleiche Skript, mit einer zusätzlichen Abfrage: if($j -gt “20”) die macht den Unterschied.

    $teaminfo = New-Team -DisplayName Testteam -Owner me@demo.it-koehler.com
    $teamgroupid = ($teaminfo).GroupId
    #setting counter $i to zero 
    $j = 0
    do{
    #do this cmdlet until it gives a result
      $teamspurl = (Get-UnifiedGroup |Where-Object {$_.ExternalDirectoryObjectId -eq "$teamgroupid"}) | Select-Object SharePointSiteUrl -ExpandProperty SharePointSiteUrl
      if(!$teamspurl){
        #wait 5 seconds for the next try
        Start-Sleep -Seconds 5
        $j++
        Write-Host "waiting for exchange online..."
        #if waited 5 second 20 times break the script
        if($j -gt "20"){
              break
            } 
      }
    }
    Until ($teamspurl)
    #count the and calculate the consumed time
    $urltime = [int]$i *5
    Write-Host "Sharepoint Online took $urltime seconds to respond and find the URL."

Das war’s schon.
HINWEIS: die beiden Beispiele funktionieren genau so, wenn die Module für Microsoft Teams und Exchange Online geladen sind und auch eine Verbindung zur Cloud besteht.
Siehe hierzu meine beiden weiteren Artikel
Experimentieren mit Microsoft Teams PowerShell Modul
und
Exchange Online PowerShell V2 Tutorial

Viel Spaß beim Warten, wenn ihr Fragen / Anregungen habt, gerne als Kommentar da lassen. Wenn euch der Artikel gefallen hat, bitte auf „Helpful“ drücken.
Bleibt gesund.

Print Friendly, PDF & Email
Was this article helpful?
YesNo
0 0 votes
Article Rating
Abonnieren
Benachrichtige mich bei
guest
0 Comments
Inline Feedbacks
View all comments