我有以下Powershell脚本:
$sentMail.Items | % { $RESULT=[Regex]::Match($_.TaskSubject ,"Request\s\d{6}"); if($RESULT.Success){$RESULT.Value} }
这给了我一个像这样的输出:
Request 123456
Request 223456
Request 443456
Request 923456
....
但是我想只获得6位数字(来自其中包含“请求”的子喷射线)。
这是我试过的,我试图再次管道结果:
$sentMail.Items | % { $RESULT=[Regex]::Match($_.TaskSubject ,"Request\s\d{6}"); if($RESULT.Success){$RESULT.Value} } | % {$RESULT=[Regex]::Match($_.TaskSubject, "\d{6}"); if($RESULT.Success){$RESULT.Value}}
但是我收到了这个错误:
ForEach-Object : Cannot bind parameter 'Process'. Cannot convert the "{ $RESULT=[Regex]::Match($_.TaskSubject, "\d{6}")
; if($RESULT.Success){$RESULT.Value} }" value of type "System.String" to type "System.Management.Automation.ScriptBlock
".
At line:1 char:120
+ $sentMail.Items | % { $RESULT=[Regex]::Match($_.TaskSubject, "Request\s\d{6}"); if($RESULT.Success){$RESULT.Value}} |
% <<<<
+ CategoryInfo : InvalidArgument: (:) [ForEach-Object], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.ForEachObjectCommand
答案 0 :(得分:2)
我认为在该行末尾传输的$Result
项将丢失TaskSubject属性标头。鉴于我认为这会更好。
$sentMail.Items | %{ $RESULT=[Regex]::Match($_.TaskSubject ,"Request\s\d{6}"); if($RESULT.Success){$RESULT.Value} } |%{$Result=[regex]::Match($_,"\d{6}"); if($RESULT.Success){$RESULT.Value}}
或者你可以跳过第二个Regex并使用split方法。
%{$_.split(" ")[1]}
答案 1 :(得分:1)
第二个示例的问题基于代码块和括号放置。尝试使代码可读并将其放在多行上,您将看到我的意思。
至于你接近你想要的第一个代码:如果你不想在结果中返回“请求”,你应该只能使用非捕获组
$sentMail.Items | % { $RESULT=[Regex]::Match($_.TaskSubject ,"(?:Request\s)\d{6}"); if($RESULT.Success){$RESULT.Value} }
<强>更新强>
显然非捕获不能按预期工作,所以我们使用后面的代码,因为它实现了相同的目标。更新了逻辑以处理结果。
$sentMail.Items | %{[Regex]::Match($_.TaskSubject,'(?<=Request\s)\d{6}')} | ?{$_.Success} | %{$_.value}
<强>输出强>
123456
223456
443456
923456
答案 2 :(得分:1)
我也会在这里回答一下,因为我在另一个问题的回复评论中回答了这个问题。我要做的是将电子邮件传递到Where语句中,该语句匹配主题行中的6位数(除非您实际使用的是Outlook Task对象,它应该与TaskSubject相同),然后将其传递到ForEach循环中吐出自动生成的$Matches
变量。像这样:
$sentMail.Items | Where { $_.Subject -match "(\d{6})" } | ForEach { $Matches[1] }
我还在我的RegEx匹配中指定了用括号括起指定数据它应该捕获6位数。这对您的示例来说并不是非常有用,但是,例如,如果您需要明确包含该主题:
请求######
并且您只想捕获您要做的6位数字 - 匹配&#34;请求(\ d {6})&#34;。如果您的电子邮件中包含“已完成######”的主题,则可以使用此功能。在文件夹中也是您不想捕获的。