powershell从正文中获取特定行

Ema*_*ele 4 powershell

我在从 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 封邮件即可禁用该流程。

我的问题是有没有办法获取包含邮件的特定行?

谢谢

zet*_*t42 6

下面是使用 .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)