Powershell 调试器如何修改运行时行为?

How could Powershell debugger can modify runtime behavior?

我尽量减少了代码以突出显示 Powershell 中的一个非常奇怪的问题

pwsh 5.1.22000.282 和 7.2.2 相同。

代码:

$outlook = new-object -com Outlook.Application;
$namespace = $outlook.GetNameSpace("MAPI");
$inputFolderObj=$namespace.Folders.Item('user@domain.com').Folders.Item('temp')
$scope = $inputFolderObj.FolderPath
$filter = ""
$search = $outlook.AdvancedSearch("'$scope'", $filter, $True)
$search.Results.Count

在 CLI 上:

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 的 Marshall 对象正在异步加载。

我们可能会在result Counting之前加一定的停顿来get object。调试断点是在默默引入这个extra-step.

最终代码:

    $outlook = new-object -com Outlook.Application;
    $namespace = $outlook.GetNameSpace("MAPI");
    $inputFolderObj=$namespace.Folders.Item('user@domain.com').Folders.Item('temp')
    $scope = $inputFolderObj.FolderPath
    $filter = ""
    $search = $outlook.AdvancedSearch("'$scope'", $filter, $True)
    Start-Sleep 10
    $search.Results.Count