Jump to content

Try Catch Befehl funktioniert nicht


Direkt zur Lösung Gelöst von cj_berlin,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Moin zusammen,

 

ich wollte ein kleines Skript basteln, um einmal im Monat die Standardberechtigung von jedem User anzupassen. Da wir aber Englische und Deutsche Clients haben, sind die Foldernames, wo man die Berechtigungen anpasst auch unterschiedlich. Ich wollte es mir einfach machen und einen Try Catch einbauen, um beide Varianten abzudecken:

 

---------------------------------

$Mailboxes = (Get-Mailbox -RecipientTypeDetails "usermailbox" -ResultSize unlimited ).alias

foreach ($Mailbox in $Mailboxes){
try

{Set-MailboxFolderPermission ${Mailbox}:\Kalender -User Default -Accessrights AvailabilityOnly}

 

catch

{Set-MailboxFolderPermission ${Mailbox}:\Calendar -User Default -Accessrights AvailabilityOnly}
}

---------------------------------

 

Hat das schon mal jemand in die Richtung probiert ? Bei mir wird Try Catch komplett ignoriert, der Rest funktioniert. Bin leider auch noch etwas der Powershell Noob, so dass ich beim googeln den Fehler nicht nachvollziehen konnte..

LG
Lukas

Link zu diesem Kommentar

Ohne es probiert zu haben, pack einfach mal alles in den Try Catch Block. Welche Fehlermeldung gibt es denn, wenn Du auf einem Englischen Client Kalender ansprichst? Nimm die Fehlermeldung in den Catch Teil mit auf, jetzt wird der Catch Teil immer aufgerufen wenn es einen Fehler gibt.

 

try
  
	$Mailboxes = (Get-Mailbox -RecipientTypeDetails "usermailbox" -ResultSize unlimited ).alias

	foreach ($Mailbox in $Mailboxes){
		{Set-MailboxFolderPermission ${Mailbox}:\Kalender -User Default -Accessrights AvailabilityOnly}
	catch
		# Wenn der Fehler wegen Kalender auftritt, führe das aus:
		{Set-MailboxFolderPermission ${Mailbox}:\Calendar -User Default -Accessrights AvailabilityOnly}
	} 

Schau doch hier mal rein: https://www.windowspro.de/script/fehlerbehandlung-powershell-erroraction-try-catch-finally

Ab hier lesen: Terminierende Fehler abfangen mit try/catch

 

EDIT: Hier noch ein Artikel von MSFT dazu: https://learn.microsoft.com/de-de/powershell/scripting/learn/deep-dives/everything-about-exceptions?view=powershell-7.3

bearbeitet von Sunny61
Link zu diesem Kommentar
  • Beste Lösung

Genau, "terminierende Fehler" sind hier das Stichwort. Einfach -ErrorAction Stop zu den Cmdlets hinzufügen, und schon sind alle Fehler terminierend.

 

Aber noch besser ist es, die Fehler gar nicht erst entstehen zu lassen: https://it-pro-berlin.de/2016/05/powershell-hack-namen-von-standardordnern-in-einem-exchange-postfach/ Ich könnte schwören, ich habe es bereits als Antwort auf Deinen anderen Thread gepostet.

Link zu diesem Kommentar
vor 2 Stunden schrieb Sunny61:

pack einfach mal alles in den Try Catch Block

Hallo Sunny,

das hat leider nicht funktioniert. 

 

vor einer Stunde schrieb cj_berlin:

Einfach -ErrorAction Stop zu den Cmdlets hinzufügen


das funktioniert, ich verstehe jetzt wo der Fehler war. Evtl hätte dann auch ein "trap" funktioniert. Danke !!

Edit: Es hat doch nicht funktioniert, weil er nach einem try auf dem catch command hängen geblieben ist.
Ich habe es dann mit der $calendar_folder Variable von CJ probiert. Funktioniert ohne Error und sieht auch viel hübscher aus :-)

 

vor einer Stunde schrieb cj_berlin:

Ich könnte schwören, ich habe es bereits als Antwort auf Deinen anderen Thread gepostet.

Ich habe gerade mal nachgeschaut, ich glaube du verwechselt mich mit jemandem :P



LG
Lukas
 

bearbeitet von Lukikum
Link zu diesem Kommentar

Hi,

 

nochmal eine Erläuterung:

 

Wenn man -ErrorAction Stop verwendet (verwenden muss, wegen try-catch), dann fliegt man beim ersten Auftreten eines Fehlers aus der umgebenden foreach-Schleife raus. Ende Gelände.

 

Das vermeidet man, indem man den catch-Block mit "continue" abschließt. Das führt zur Weiterverarbeitung der Schleife mit dem nächsten Item.

 

Also ungefähr so:

 

foreach ($Mailbox in $Mailboxes) {

try {Set-MailboxFolderPermission ... -ea Stop}

catch {

Set-MailboxFolderPermission ...

continue

}

}

bearbeitet von massaraksch
Link zu diesem Kommentar
vor 6 Minuten schrieb massaraksch:

dann fliegt man beim ersten Auftreten eines Fehlers aus der umgebenden foreach-Schleife raus. Ende Gelände.

 

Das wär mir neu. ;-) Versuch mal Folgendes in einem beliebigen Verzeichnis:

 

Get-ChildItem |
    ForEach-Object {
        try {
            Get-ItemProperty -Path 'bla keks' -ErrorAction stop
        }
        catch {
            'bla keks'
        }
    }

 

Du wirst so viele "Blakekse" sehen, wie es Dateien und Ordner in diesem Verzeichnis gibt.

Link zu diesem Kommentar
vor 30 Minuten schrieb massaraksch:

Hi,

 

nochmal eine Erläuterung:

 

Wenn man -ErrorAction Stop verwendet (verwenden muss, wegen try-catch), dann fliegt man beim ersten Auftreten eines Fehlers aus der umgebenden foreach-Schleife raus. Ende Gelände.

 

Das vermeidet man, indem man den catch-Block mit "continue" abschließt. Das führt zur Weiterverarbeitung der Schleife mit dem nächsten Item.

 

Also ungefähr so:

 

foreach ($Mailbox in $Mailboxes) {

try {Set-MailboxFolderPermission ... -ea Stop}

catch {

Set-MailboxFolderPermission ...

continue

}

}

Moin,

 

Du verwechselst hier was. Das, was Du beschreibst, passiert bei Trap, und "continue" braucht man dort, um die Ausgabe der Fehlermeldung zu unterdrücken. Try/catch behandelt alles lokal, und "continue" führt dazu, dass der restliche Codeblock innerhalb der Schleife für diese Iteration übersprungen wird.

bearbeitet von cj_berlin
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...