Я сократил код до минимума, чтобы выделить одну очень странную проблему с Powershell.
То же самое для pwsh 5.1.22000.282 и 7.2.2.
Код:
$outlook = new-object -com Outlook.Application;
$namespace = $outlook.GetNameSpace("MAPI");
$inputFolderObj=$namespace.Folders.Item('[email protected]').Folders.Item('temp')
$scope = $inputFolderObj.FolderPath
$filter = ""
$search = $outlook.AdvancedSearch("'$scope'", $filter, $True)
$search.Results.Count
в командной строке:
PS C:\dummyfolder> .\test.ps1
0
PS C:\dummyfolder> .\test.ps1 # reproductible
0
PS C:\dummyfolder> Set-PSBreakpoint -Line 7 -Script .\test.ps1 | out-null
PS C:\dummyfolder> .\test.ps1
Passage en mode débogage. Utilisez h ou ? pour obtenir de l'aide.
Appuyez sur Point d'arrêt de ligne sur « C:\Udummyfolder\test.ps1:7 »
Au caractère C:\dummyfolder\test.ps1:7 : 1
+ $search.Results.Count
+ ~~~~~~~~~~~~~~~~~~~~~
[DBG]: PS C:\dummyfolder>> c
1
Это ошибка? Я что-то пропустил здесь? Спасибо,
Редактировать 17.03.2022 - сделал несколько тестов. Похоже, что наличие точки останова в строке 7 и получение только результатов не дает '1' каждый раз. Перезапуск $search
, затем $search.Results
несколько раз в точке останова, наконец, дает «1». Поэтому это может быть проблемой с взаимодействием Маршалла с Outlook, но если кто-нибудь знает, почему...
Отвечать:
Объект Marshall, связанный с Outlook, загружается асинхронно.
Мы можем добавить некоторую паузу перед подсчетом результата для получения объекта. Точка останова отладки молча вводила этот дополнительный шаг.
Окончательный код:
$outlook = new-object -com Outlook.Application;
$namespace = $outlook.GetNameSpace("MAPI");
$inputFolderObj=$namespace.Folders.Item('[email protected]').Folders.Item('temp')
$scope = $inputFolderObj.FolderPath
$filter = ""
$search = $outlook.AdvancedSearch("'$scope'", $filter, $True)
Start-Sleep 10
$search.Results.Count