如何用PowerShell搜索Outlook 2019联系人自定义字段ABC中值为123的条目
PowerShell 筛选Outlook自定义字段匹配的联系人
可用实现代码
方案1:遍历匹配(推荐,部署简单无需事件监听)
该方案对普通量级的联系人列表执行效率足够,逻辑稳定不易出错:
Add-Type -assembly "Microsoft.Office.Interop.Outlook" -ErrorAction Stop $Outlook = New-Object -comobject Outlook.Application -ErrorAction stop $objNameSpace = $Outlook.GetNameSpace("MAPI") # 获取默认联系人文件夹 $objContacts = $objNameSpace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderContacts) # 遍历所有联系人筛选匹配项 foreach ($contact in $objContacts.Items) { $customProp = $contact.UserProperties.Find("ABC") # 判断自定义字段存在且值为123 if ($customProp -and $customProp.Value -eq "123") { Write-Host $contact.FullName } }
运行后会直接输出符合要求的联系人姓名:
John Doe Andrew Citizen
方案2:AdvancedSearch 实现(适合联系人数目较大的场景)
如果需要处理大量联系人,可使用高级搜索接口,自定义字段的查询URN格式为http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/ABC/0x0000001F,其中00020329-...是用户自定义字段的固定GUID,末尾的0x0000001F代表字符串类型:
Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null $outlook = New-Object -com Outlook.Application; $namespace = $outlook.GetNamespace("MAPI"); # 监听搜索完成事件 Register-ObjectEvent -InputObject $outlook -EventName "AdvancedSearchComplete" -Action { if ($Args.Results) { foreach ($result in $Args.Results) { Write-Host $result.FullName } } } Function Search-ContactByCustomField { # 获取默认联系人文件夹路径作为搜索范围 $contactFolder = $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderContacts) $scope = $contactFolder.FolderPath # 自定义字段过滤规则 $filter = "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/ABC/0x0000001F = '123'" $search = $outlook.AdvancedSearch("'$scope'", $filter, $True) } # 执行搜索 Search-ContactByCustomField
注意事项
- 运行脚本前请确保Outlook客户端已正常启动
- 代码中自定义字段名
ABC需要和你在Outlook中创建的字段名大小写完全一致 - 如果自定义字段是数值类型,可将方案1的判断条件改为
$customProp.Value -eq 123,方案2的末尾类型标识改为0x00000003
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

