我在从 powershell 主体获取特定行时遇到一些问题。人力资源团队向我们发送电子邮件,逻辑应用程序获取电子邮件正文并将其传递给禁用用户的脚本。
本体是这样的:
Hi,
the following user have to be dismiss:
#mail: user1@mycompany.com
#mail: user2@mycompany.com
#mail: user2@mycompany.com
Bye
hr team
hrteam@mycompany.com
Run Code Online (Sandbox Code Playgroud)
我只想获取特定行:
#mail: user1@mycompany.com
#mail: user2@mycompany.com
#mail: user2@mycompany.com
Run Code Online (Sandbox Code Playgroud)
为此,我用以下代码做了一个技巧:
$Body
$SplitBody = $Body.split("").split(" ").Split("#")
$objetbody = $SplitBody.Replace(" ","").Trim()
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
Hi,
the
following
user
have
to
be
dismiss:
mail:
user1@mycompany.com
mail:
user2@mycompany.com
mail:
user2@mycompany.com
Bye
hr
team
hrteam@mycompany.com
Run Code Online (Sandbox Code Playgroud)
之后,我将 $objetbody 传递到 foreach 并循环所有行(在该 foreach 的末尾放置一个中断,因为它可以禁用 HR 邮件)。如果 HR 仅发送 1 封邮件即可禁用该流程。
我的问题是有没有办法获取包含邮件的特定行?
谢谢
下面是使用 .NET RegEx类输出所有电子邮件地址的一行代码:
[RegEx]::Matches( $body, '(?<=#mail:\s*)\S+' ).Value
Run Code Online (Sandbox Code Playgroud)
使用以下方法也可以实现同样的效果Select-String:
($body | Select-String '(?<=#mail:\s*)\S+' -AllMatches).Matches.Value
Run Code Online (Sandbox Code Playgroud)
正则表达式细分:
(?<=...开始正向查找模式后面,这意味着我们搜索的子字符串必须位于给定模式之前,但该模式不会包含在结果中
#mail:\s*...文字“#mail:”后跟可选的空格)...结束了背后的模式\S+...任何非空白字符序列 -> 电子邮件地址我保持电子邮件地址模式简单,因为使用正则表达式正确匹配电子邮件地址可能很困难。无论如何,您可能希望将验证作为单独的步骤进行,以便您可以报告无效地址。使用 .NETMailAddress类可以更简单地完成此操作:
$mailAddresses = [RegEx]::Matches( $body, '(?<=#mail:\s*)\S+' ).Value
foreach( $adr in $mailAddresses) {
try {
[System.Net.Mail.MailAddress]::new( $adr )
} catch {
# The MailAddress constructor throws FormatException for invalid address
Write-Error "Invalid mail address: '$adr'"
}
}
Run Code Online (Sandbox Code Playgroud)