我有以下代码,列出收件箱文件夹(Outlook)中的前5个项目。
我如何仅提取它的数字部分(比如 - 7位任意数字,嵌入其他文本中)?然后使用Powershell命令,我真的想把这些提取的数字转储到CSV文件中(因此,它们可以很容易地合并到我使用的现有电子表格中)。
这是我尝试的内容:
$outlook = new-object -com Outlook.Application
$sentMail = $outlook.Session.GetDefaultFolder(6) # == olFolderInbox
$sentMail.Items | select -last 10 TaskSubject # ideally, grabbing first 20
$matches2 = "\d+$"
$res = gc $sentMail.Items | ?{$_ -match $matches2 | %{ $_ -match $matches2 | out-null; $matches[1] }
但这不能正常运行,而是让我一直等待输入符号:像这样:
>>
>>
>>
我是否需要在第1部分和第2部分之间创建单独的变量?
答案 0 :(得分:3)
不确定$matches
变量的用途,但尝试用下面的内容替换最后一行。
对于主题行项目:
$sentMail.Items | % { $_.TaskSubject | Select-String -Pattern '^\d{3}-\d{3}-\d{4}' | % {([string]$_).Substring(0,12)} }
对于邮件正文项:
$sentMail.Items | % { ($_.Body).Split("`n") | Select-String -Pattern '^\d{3}-\d{3}-\d{4}' |% {([string]$_).Substring(0,12)} }
这是对我经常使用的Select-String的引用。 https://technet.microsoft.com/library/hh849903.aspx
这是对我从未使用过的电话号码部分的引用,但发现非常酷。 http://blogs.technet.com/b/heyscriptingguy/archive/2011/03/24/use-powershell-to-search-a-group-of-files-for-phone-numbers.aspx
祝你好运!以下是通过主题行进行7位数提取的编辑版本。这假设数字在每一侧都有一个空格,但如果需要可以稍微修改一下。您可能还希望通过将-First部分更改为Select *或仅将范围设置为100来调整深度。
$outlook = New-Object -com Outlook.Application
$Mail = $outlook.Session.GetDefaultFolder(6) # Folder Inbox
$Mail.Items | select -First 100 TaskSubject |
% { $_.TaskSubject | Select-String -Pattern '\s\d{7}\s'} |
% {((Select-String -InputObject $_ -Pattern '\s\d{7}\s').Line).split(" ") |
% {if(($_.Length -eq 7) -and ($_ -match '\d{7}')) {$_ | Out-File -FilePath "C:\Temp\SomeFile.csv" -Append}}}
答案 1 :(得分:1)
您已经解决/想出了一些,但我想解释您当前代码的问题。
如果您希望多次匹配并希望返回这些匹配,那么您需要将Select-String
与-AllMatches
参数一起使用。在您的示例中,您的正则表达式当前正在查找主题末尾的一系列数字。这只会返回一个匹配,所以让我们看一下代码的问题。
$sentMail.Items | select -last 10 TaskSubject
您正在过滤最后10个项目,但您没有存储这些项目供以后使用,因此它们只会显示在屏幕上。我们稍后会介绍解决方案。
使用-match
的一个主要原因是获取为if
块和where
子句等代码返回的布尔值。您仍然可以按照预期的方式使用它。查看当前有问题的代码:
$res = gc $sentMail.Items | ?{$_ -match $matches2 | %{ $_ -match $matches2 | out-null; $matches[1] }
与此相关的两个主要问题是您在每个项目上调用Get-Content
(gc
)。 Get-Content
用于提取$sentMail.Items
不是的文件数据。您还有一个大块。块将根据真或假条件将数据传递给输出流。您的错误陈述?{$_ -match $matches2 | %{ $_ -match $matches2 | out-null; $matches[1] }
不会这样做......至少不是很好。
$outlook = new-object -com Outlook.Application
$sentMail = $outlook.Session.GetDefaultFolder(6) # == olFolderInbox
$matches2 = "\d+$"
$sentMail.Items | select -last 10 -ExpandProperty TaskSubject | ?{$_ -match $matches2} | %{$Matches[0]}
获取最后10个电子邮件主题并检查其中任何一个是否与正则表达式字符串$matches2
匹配。 如果,则返回字符串匹配到标准输出。