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
我尽量减少了代码以突出显示 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