Feiertage in Outlook falsch
Hallo zusammen,
ich bin gerade von einem User darauf aufmerksam gemacht worden dass die Pfingstfeiertage 2015 in Outlook falsch sind.
Nach einigen Google Abfragen weiß ich zwar wie ich das Problem lösen kann (mit Feiertage löschen und .hol File tauschen...), irgendwie macht das aber bei 900 Clients keinen Spass.
Da steiken auch meine Azubis
Hat einer von euch hier schon eine Enterprise-taugliche Lösung oder hab ich mal wieder ein MS Hotfix übersehen?
Vielen Dank für euren Input,
Melmax
ich bin gerade von einem User darauf aufmerksam gemacht worden dass die Pfingstfeiertage 2015 in Outlook falsch sind.
Nach einigen Google Abfragen weiß ich zwar wie ich das Problem lösen kann (mit Feiertage löschen und .hol File tauschen...), irgendwie macht das aber bei 900 Clients keinen Spass.
Da steiken auch meine Azubis
Hat einer von euch hier schon eine Enterprise-taugliche Lösung oder hab ich mal wieder ein MS Hotfix übersehen?
Vielen Dank für euren Input,
Melmax
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 255392
Url: https://administrator.de/contentid/255392
Ausgedruckt am: 22.11.2024 um 13:11 Uhr
19 Kommentare
Neuester Kommentar
Hallo Melmax,
ließe sich mit einem Powershell-Script machen, hier mal schnell skizziert:
(Das korrigierte HOL-File kannst du ja auf ein Netzlaufwerk legen / Pfad Zeile 11)
Grüße Uwe
ließe sich mit einem Powershell-Script machen, hier mal schnell skizziert:
(Das korrigierte HOL-File kannst du ja auf ein Netzlaufwerk legen / Pfad Zeile 11)
function Remove-OutlookHolidays(){
$objOL = New-Object -ComObject "Outlook.Application"
$calendar = $objOL.GetNamespace("MAPI").GetDefaultFolder(9)
$holidays = $calendar.Items.Restrict("@SQL=""http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Keywords"" = 'Feiertag'")
while($holidays.Count -gt 0){
$holidays.Remove(1)
}
}
function Add-OutlookHolidays(){
$holFile = "\\Server\Share\OUTLOOK_FIX.HOL"
$objOL = New-Object -ComObject "Outlook.Application"
$calendar = $objOL.GetNamespace("MAPI").GetDefaultFolder(9)
$holidays = [regex]::Match((gc $holfile -raw),'(?ism)^\[Deutschland\].*?$(.*?)(^\[|\Z)').Groups[1].Value.Trim().Split("`n") | ?{$_ -match ','}
$holidays | %{
$line = $_.Split(",")
$app = $calendar.Items.Add(1)
$app.AllDayEvent = $true
$app.Start = get-date $line[1]
$app.Subject = $line
$app.ReminderSet = $false
$app.Categories = "Feiertag"
$app.Location = "Deutschland"
$app.Save()
}
}
write-host "Entferne Outlook-Feiertage ..."
Remove-OutlookHolidays
write-host "Füge Outlook-Feiertage hinzu...Bitte warten..."
Add-OutlookHolidays
Hallo Uwe,
vielen Dank. Ich beschäftige mich jetzt zum ersten Mal mit PowerShell. Mir ist nicht klar was z.B. in Zeile 4 gemacht wird. In die Variable $holidays schreibst du die Feiertage aus dem Kalender...? Was macht @sql und der link?
Würde gerne nur die beiden falschen tage ersetzten, wenn sie denn existieren - komme aber mit meinen beschränkten Kenntnissen nicht weiter.
Danke im Voraus!
Grüße
vielen Dank. Ich beschäftige mich jetzt zum ersten Mal mit PowerShell. Mir ist nicht klar was z.B. in Zeile 4 gemacht wird. In die Variable $holidays schreibst du die Feiertage aus dem Kalender...? Was macht @sql und der link?
Würde gerne nur die beiden falschen tage ersetzten, wenn sie denn existieren - komme aber mit meinen beschränkten Kenntnissen nicht weiter.
Danke im Voraus!
Grüße
Hallo FrauMue,
Siehe: Items.Restrict Method (Outlook)
Grüße Uwe
/Eine Einführung in Powershell können wir hier leider nicht jedem geben...siehe dazu://
Powershell Grundlagen- und Praxisvermittlung:
Zitat von @FrauMue:
vielen Dank. Ich beschäftige mich jetzt zum ersten Mal mit PowerShell. Mir ist nicht klar was z.B. in Zeile 4 gemacht wird.
In die Variable $holidays schreibst du die Feiertage aus dem Kalender...?
Ja damit werden auf effektive Weise alle Feiertage gefiltert um nicht alle Termine mit einer Schleife durchitterieren zu müssen.vielen Dank. Ich beschäftige mich jetzt zum ersten Mal mit PowerShell. Mir ist nicht klar was z.B. in Zeile 4 gemacht wird.
In die Variable $holidays schreibst du die Feiertage aus dem Kalender...?
Siehe: Items.Restrict Method (Outlook)
Was macht @sql und der link?
Das sind PropTags die intern von Outlook Verwendung finden. Diese kann man sich z.B. mit MFCMAPI anzeigen lassen.Würde gerne nur die beiden falschen tage ersetzten, wenn sie denn existieren - komme aber mit meinen beschränkten
Kenntnissen nicht weiter.
Das Script entfernt alle Feiertage. Dann holst du dir das korrigierte HOL-File mit den korrigierten Feiertagen und lässt es mit der Import-Funktion wieder alle importieren. Feddich.Kenntnissen nicht weiter.
Grüße Uwe
/Eine Einführung in Powershell können wir hier leider nicht jedem geben...siehe dazu://
Powershell Grundlagen- und Praxisvermittlung:
Zitat von @FrauMue:
Würde gerne nur die beiden falschen tage ersetzten, wenn sie denn existieren - komme aber mit meinen beschränkten
Kenntnissen nicht weiter.
Sorry hatte ich glatt überlesen, für den Fall reicht folgendes Script:Würde gerne nur die beiden falschen tage ersetzten, wenn sie denn existieren - komme aber mit meinen beschränkten
Kenntnissen nicht weiter.
Korrigiert Pfingstfeiertage 2015 (Pfingstsonntag und Pfingstmontag) im Standardkalender von Outlook.
- Pfingstsonntag vom 28.05.2015 auf 24.05.2015
- Pfingstmontag vom 29.05.2015 auf 25.05.2015
$objOL = New-Object -ComObject "Outlook.Application"
$calendar = $objOL.GetNamespace("MAPI").GetDefaultFolder(9)
$calendar.Items.Restrict("[Subject] = 'Pfingstsonntag' AND [Start] = '" + (get-date '28.05.2015' -Format 'g') + "'") | %{$_.Start = get-date '24.05.2015';$_.Save()}
$calendar.Items.Restrict("[Subject] = 'Pfingstmontag' AND [Start] = '" + (get-date '29.05.2015' -Format 'g') + "'") | %{$_.Start = get-date '25.05.2015'; $_.Save()}
Grüße Uwe
So hier noch das Script als VBS umgeschrieben:
Ist ja Ende Mai sowieso obsolet
Grüße Uwe
Set objOL = CreateObject("Outlook.Application")
Set cal = objOL.GetNamespace("MAPI").GetDefaultFolder(9)
Set items = cal.items.Restrict("[Subject] = 'Pfingstsonntag' AND [Start] = '" & FormatDateTime("28.05.2015", vbShortDate) & " 00:00'")
Set itm = items.GetFirst()
If Not itm Is Nothing Then
itm.start = CDate("24.05.2015")
itm.Save
End If
Set items = cal.items.Restrict("[Subject] = 'Pfingstmontag' AND [Start] = '" & FormatDateTime("29.05.2015", vbShortDate) & " 00:00'")
Set itm = items.GetFirst()
If Not itm Is Nothing Then
itm.start = CDate("25.05.2015")
itm.Save
End If
Grüße Uwe
Installation von PS auf den Rechnern will ich eig. vermeiden.
Lieber die Kisten migrieren ... ist schon längst überfällig...
Hallo Uwe,
gibt es dazu ggf. schon einen neuen Stand?
Wollte das Skript gerade ausführen und erhalte folgende Fehlermeldungen:
gibt es dazu ggf. schon einen neuen Stand?
Wollte das Skript gerade ausführen und erhalte folgende Fehlermeldungen:
Entferne Outlook-Feiertage ...
Array-Index außerhalb des zulässigen Bereichs.
In C:\Users\meinnutzername\Desktop\Neuer Ordner (5)\Feiertage.ps1:6 Zeichen:9
+ $holidays.Remove(1)
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:) , COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException
Füge Outlook-Feiertage hinzu...Bitte warten...
Get-Date : Der Parameter "Date" kann nicht an das Ziel gebunden werden. Ausnahme beim Festlegen von
"Date": "NULL kann nicht in den Typ "System.DateTime" konvertiert werden."
In C:\Users\meinnutzername\Desktop\Neuer Ordner (5)\Feiertage.ps1:19 Zeichen:31
+ $app.Start = get-date $line[1]
+ ~~~~~~~~
+ CategoryInfo : WriteError: (:) [Get-Date], ParameterBindingException
+ FullyQualifiedErrorId : ParameterBindingFailed,Microsoft.PowerShell.Commands.GetDateCommand
Hallo Uwe,
das Problem ist damit leider noch nicht behoben.
Die outlook.hol liegt einfach auf C, der Pfad dementsprechend C:\outlook.hol und ist auch gefüllt;
Das Skript legt nun keinen Feiertag mehr an. (Vorher nur einen mit dem Namen Deutschland) Lege ich einen Feiertag mit der Kategorie Feiertag an und führe das Skript aus, löscht er diesen, der Fehler von oben taucht jedoch wieder auf. :s
Hast du da ggf. freundlicherweise noch eine Lösung bereit?
Grüße
das Problem ist damit leider noch nicht behoben.
Die outlook.hol liegt einfach auf C, der Pfad dementsprechend C:\outlook.hol und ist auch gefüllt;
[Deutschland] 11
Reformationstag, 2017/10/31
1. Weihnachtstag, 2017/12/25
1. Weihnachtstag, 2018/12/25
und so weiter
Das Skript legt nun keinen Feiertag mehr an. (Vorher nur einen mit dem Namen Deutschland) Lege ich einen Feiertag mit der Kategorie Feiertag an und führe das Skript aus, löscht er diesen, der Fehler von oben taucht jedoch wieder auf. :s
Hast du da ggf. freundlicherweise noch eine Lösung bereit?
Grüße
Sorry läuft hier überall einwandfrei. Du musst das original HOL File nehmen .... Nicht nur die Deutschland Section rauskopieren, wie du oben zeigst, denn das obige Regex ist darauf ausgelegt. Willst du es anders muss es angepasst werden.
p.s. In den aktuellen Jahren gibt es keine falschen Feiertage mehr. Das war nur für 2015 der Fall.
p.s. In den aktuellen Jahren gibt es keine falschen Feiertage mehr. Das war nur für 2015 der Fall.
Zur Info: Habe die Regex noch so angepasst das du den Deutschlandabschnitt auch alleine in das File kopieren kannst.
Grüße Uwe
Hintergrund der Termine ist übrigens, dass gewünscht ist alle freien Tage zu veröffentlichen. So haben wir bspw. am 16.06. nächste Woche auch frei.
Na dann, alles klar, zweckentfremdet quasi .Grüße Uwe
Hallo Uwe,
auch wenn ich dich ungerne erneut nerven möchte, habe ich zur Zeit folgendes Problem (auf dem Client):
Nutze ich nur den Befehl zum löschen, erscheint keine Fehlermeldung. Wenn ich vorher manuell einen Feiertag mit der Kategorie "Feiertag" anlege, wird dieser auch gelöscht.
Lasse ich das Skript vollständig, erscheinen folgende Fehlermeldungen:
Es wird zusätzlich ein Feiertag namens "Deutschland" angelegt.
Meine Outlook.hol Datei sieht wie folgt aus:
Dein Skript sieht wie folgt aus:
Die Outlook.hol liegt natürlich auch in dem Ordner "Mueller".
Vielen Dank für deine kommende Antwort und Grüße
René
auch wenn ich dich ungerne erneut nerven möchte, habe ich zur Zeit folgendes Problem (auf dem Client):
Nutze ich nur den Befehl zum löschen, erscheint keine Fehlermeldung. Wenn ich vorher manuell einen Feiertag mit der Kategorie "Feiertag" anlege, wird dieser auch gelöscht.
Lasse ich das Skript vollständig, erscheinen folgende Fehlermeldungen:
Get-Content : Es wurde kein Parameter gefunden, der dem Parameternamen "raw" entspricht.
Bei C:\Users\Mueller\Desktop\Mueller\Feiertage.ps1:14 Zeichen:49
+ $holidays = [regex]::Match((gc $holfile -raw <<<< ),'(?ism)^\[Deutschland\].*?$(.*?)(^\[|\Z)').Groups[1].Value.Trim().Split("`n") | ?{$_ -match ','}
+ CategoryInfo : InvalidArgument: (:) [Get-Content], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetContentCommand
Sie können keine Methode für einen Ausdruck mit dem Wert NULL aufrufen.
Bei C:\Users\Mueller\Desktop\Mueller\Feiertage.ps1:16 Zeichen:25
+ $line = $_.Split <<<< (",")
+ CategoryInfo : InvalidOperation: (Split:String) , RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
In einem NULL-Array kann kein Index erstellt werden.
Bei C:\Users\Mueller\Desktop\Mueller\Feiertage.ps119 Zeichen:37
+ $app.Start = get-date $line[ <<<< 1]
+ CategoryInfo : InvalidOperation: (1:Int32) , RuntimeException
+ FullyQualifiedErrorId : NullArray
In einem NULL-Array kann kein Index erstellt werden.
Bei C:\Users\Mueller\Desktop\Mueller\Feiertage.ps1:20 Zeichen:30
+ $app.Subject = $line[ <<<< 0]
+ CategoryInfo : InvalidOperation: (0:Int32) , RuntimeException
+ FullyQualifiedErrorId : NullArray
Es wird zusätzlich ein Feiertag namens "Deutschland" angelegt.
Meine Outlook.hol Datei sieht wie folgt aus:
[Deutschland] 276
Reformationstag, 2017/10/31
1. Weihnachtstag, 2017/12/25
1. Weihnachtstag, 2018/12/25
1. Weihnachtstag, 2019/12/25
1. Weihnachtstag, 2020/12/25
1. Weihnachtstag, 2021/12/25
1. Weihnachtstag, 2022/12/25
1. Weihnachtstag, 2023/12/25
//und so weiter bis//
Tag d. Dt. Einheit, 2022/10/03
Tag d. Dt. Einheit, 2023/10/03
Tag d. Dt. Einheit, 2024/10/03
Tag d. Dt. Einheit, 2025/10/03
Dein Skript sieht wie folgt aus:
function Remove-OutlookHolidays(){
$objOL = New-Object -ComObject "Outlook.Application"
$calendar = $objOL.GetNamespace("MAPI").GetDefaultFolder(9)
$holidays = $calendar.Items.Restrict("@SQL=""http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Keywords"" = 'Feiertag'")
while($holidays.Count -gt 0){
$holidays.Remove(1)
}
}
function Add-OutlookHolidays(){
$holFile = "C:\Users\Mueller\Desktop\Mueller\outlook.hol"
$objOL = New-Object -ComObject "Outlook.Application"
$calendar = $objOL.GetNamespace("MAPI").GetDefaultFolder(9)
$holidays = [regex]::Match((gc $holfile -raw),'(?ism)^\[Deutschland\].*?$(.*?)(^\[|\Z)').Groups[1].Value.Trim().Split("`n") | ?{$_ -match ','}
$holidays | %{
$line = $_.Split(",")
$app = $calendar.Items.Add(1)
$app.AllDayEvent = $true
$app.Start = get-date $line[1]
$app.Subject = $line
$app.ReminderSet = $false
$app.Categories = "Feiertag"
$app.Location = "Deutschland"
$app.Save()
}
}
write-host "Entferne Outlook-Feiertage ..."
Remove-OutlookHolidays
write-host "Füge Outlook-Feiertage hinzu...Bitte warten..."
Add-OutlookHolidays
Die Outlook.hol liegt natürlich auch in dem Ordner "Mueller".
Vielen Dank für deine kommende Antwort und Grüße
René
Get-Content : Es wurde kein Parameter gefunden, der dem Parameternamen "raw" entspricht.
Du verwendest nicht mindestens PS 3.0 , das ist dein Fehler! Denn dort gibt es den Parameter -raw noch nichtWenn du tatsächlich noch die PS 2.0 verwendest, schreibst du das
gc $holfile -raw
um in (gc $holfile | out-string)
Grüße Uwe