Получите сегодняшние встречи из перспективы с PowerShell: нежелательные результаты - PullRequest
1 голос
/ 27 марта 2012

Я извлекаю сегодняшние встречи со следующим кодом:

$olFolderCalendar = 9
$ol = New-Object -ComObject Outlook.Application
$ns = $ol.GetNamespace('MAPI')
$Start = (Get-Date).AddDays(-1).ToShortDateString() + " 00:00"
$End = (Get-Date).AddDays(+1).ToShortDateString() + " 00:00"

$Filter = "[MessageClass]='IPM.Appointment' AND [Start] > '$Start' AND [End] < '$End'"

$Appointments = $ns.GetDefaultFolder($olFolderCalendar).Items
$Appointments.Sort("[Start]")
$Appointments.IncludeRecurrences = $false

foreach ($Appointment in $Appointments.Restrict($Filter) ) {
    ...
}

Все сегодняшние встречи перечислены в списке, но также и много повторяющихся встреч, которые НЕ происходят сегодня (дни рождения, еженедельные встречи, ...).Любая идея, как избежать этого?

РЕДАКТИРОВАТЬ: Кажется, что все эти нежелательные встречи изначально с моего мобильного телефона синхронизированы с внешним видом.Я попробую скрипт на «чистом» ПК.

РЕДАКТИРОВАТЬ: я пробовал скрипт на другом ПК без синхронизированных элементов, и это то же самое: все повторяющиеся элементы отображаются независимо от того, сегодня они или нет.AND [IsRecurring] = '$ False' также не помогает.

Ответы [ 4 ]

2 голосов
/ 27 марта 2012

Попробуйте поменять фильтр:

$Filter = "[MessageClass]='IPM.Appointment' AND [Start] > '$Start' AND [End] < '$End'  AND     [IsRecurring] = '$False'"

Сработало у меня здесь.

1 голос
/ 13 марта 2017

Понимание того, что это очень запоздалый ответ, но оно в вашем фильтре. Используя > и <, вы исключаете элементы, начинающиеся или заканчивающиеся в полночь, которые охватывают весь день и повторяющиеся элементы.

Попробуйте следующее:

$filter = "[MessageClass]='IPM.Appointment' AND [Start] >= '$Start' AND [End] <= '$End'"

Также поставьте строку IncludeRecurrences перед Sort:

$Appointments.IncludeRecurrences = $true
$Appointments.Sort("[Start]")
1 голос
/ 28 марта 2012

Если предложение @marceljg не работает для вас, рассмотрите возможность отфильтровать нежелательные встречи, отправив в командлет Where-Object

0 голосов
/ 26 октября 2017

Первоначальный запрос должен включать исходную встречу серии, поэтому, если серия началась 3 месяца назад, диапазон дат сбора встреч ($ folder.items) должен быть установлен соответствующим образом.

После этого вы можетефильтр для желаемого диапазона дат.

Этот код работает:

Function Get-OutlookCalendar
{
 echo starting...
 Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null
 $olFolders = "Microsoft.Office.Interop.Outlook.OlDefaultFolders" -as [type]
 $outlook = new-object -comobject outlook.application
 $namespace = $outlook.GetNameSpace("MAPI")
 $folder = $namespace.getDefaultFolder($olFolders::olFolderCalendar)

 $a = Get-Date -Hour 0 -Minute 00 -Second 00
 $b = (Get-Date -Hour 0 -Minute 00 -Second 00).AddDays(7)
 echo From $a To $b

 $Appointments = $folder.Items
 $Appointments.IncludeRecurrences = $true
 $Appointments.Sort("[Start]")

 $Appointments | Where-object { $_.start -gt $a -AND $_.start -lt $b } | Select-Object -Property IsRecurring, RecurrenceState, Subject, Start, Location

} #end function Get-OutlookCalendar

Чтобы запустить это - для чайников, как и я вчера:)

cmd
powershell
PS C:\Users\Jose\Documents\WindowsPowerShell> Import-Module -Name Outlook\expcal.psm1 -Force
PS C:\Users\Jose\Documents\WindowsPowerShell> Get-OutlookCalendar
...