Home > Mobile >  powershell get specific row from a body
powershell get specific row from a body

Time:01-24

i'm getting some problem to get a specific row from a powershell body. HR team send email to us, a logic app get the body of email and pass it to a script that disable the user.

The body is like this:

Hi,

the following user have to be dismiss:

#mail: [email protected]
#mail: [email protected]
#mail: [email protected]


Bye
hr team

[email protected]
 

i would like to get only the specific row:

    #mail: [email protected]
    #mail: [email protected]
    #mail: [email protected]

to do this i did a trick with following code:

    $Body
    $SplitBody = $Body.split("").split(" ").Split("#")
    $objetbody = $SplitBody.Replace(" ","").Trim()

and i got following result:

Hi,
the
following
user
have
to
be
dismiss:

mail:
[email protected]

mail:
[email protected]

mail:
[email protected]
Bye
hr
team
[email protected]

after that i pass $objetbody into a foreach and loop all row(at the end of this foreach is put a break becouse it can disable HR mail). The flow work if HR sent only 1 mail to disable.

My question is there is a way to got that specific row that contains the mails?

Thanks

CodePudding user response:

Here is a one-liner to output all email addresses using the .NET RegEx class:

[RegEx]::Matches( $body, '(?<=#mail:\s*)\S ' ).Value

The same can be achieved using Select-String:

($body | Select-String '(?<=#mail:\s*)\S ' -AllMatches).Matches.Value

RegEx breakdown:

  • (?<= ... starts a positive look behind pattern, meaning that the sub string we search for must be preceded by the given pattern, but this pattern won't be included in the result
    • #mail:\s* ... literal "#mail:" followed by optional whitespace
  • ) ... ends the look behind pattern
  • \S ... any sequence of non-whitespace characters -> the email address

I kept the email address pattern simple, because correctly matching email addresses using RegEx can be hard. Anyway you propably want to do validation as a separate step so you can report invalid addresses. This can be done much simpler using the .NET MailAddress class:

$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'"
    }    
}

CodePudding user response:

You could use a loop in addition to the -match operator and the use of the automatic variable $Matches:

foreach($line in $Body)
{
    if($line -match '^#mail: (.*@.*\.[\w\d] )')
    {
        $Matches[1]
    }
}

From the example above, $Matches[1] would return the values for the matched capturing group:

[email protected]
[email protected]
[email protected]

If you want to keep #mail: use $Matches[0] instead.

  •  Tags:  
  • Related