使用PowerShell,如何从主题行(电子邮件),正则表达式中提取7位数字?

时间:2015-02-11 19:25:51

标签: powershell powershell-v2.0

我有以下代码,列出收件箱文件夹(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部分之间创建单独的变量?

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-Contentgc)。 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匹配。 如果,则返回字符串匹配到标准输出。