Home > other >  Send confirmation message if command ran with Invoke-Expression completes successfully
Send confirmation message if command ran with Invoke-Expression completes successfully

Time:01-23

I'm writing a PowerShell script to add / remove people from a distribution group. I want to send a message if the action was successful and another if it failed. This is part of the script:

foreach ($x in Get-Content $pathfile\inputfile.txt) {
$USER = $x.Split(',')[0]
$ACTION = $x.Split(',')[1]
$COMMAND = (Write-Output "$ACTION-DistributionGroupMember -Identity 'Group Name' -Member $USER")
if ($ACTION -ieq "remove") {
$COMMAND = $COMMAND   ' -Confirm:$false'
Invoke-Expression $COMMAND
}
else {
Invoke-Expression $COMMAND
}
}

inputfile.txt, for the sake of information is:

[email protected],Add
[email protected],Remove

I've tried using $? and $lasExitCode but neither of those worked as expected as they only consider the output of "Invoke-Expression" and that is always successful.

What I am expecting is:

foreach ($x in Get-Content $pathfile\inputfile.txt) {
$USER = $x.Split(',')[0]
$ACTION = $x.Split(',')[1]
$COMMAND = (Write-Output "$ACTION-DistributionGroupMember -Identity 'Group Name' -Member $USER")
if ($ACTION -ieq "remove") {
$COMMAND = $COMMAND   ' -Confirm:$false'
Invoke-Expression $COMMAND

#if $COMMAND successful: Write-Output "$ACTION on $USER succeeded."
#if $COMMAND unsuccessful: Write-Output "$ACTION on $USER failed."

}
else {
Invoke-Expression $COMMAND

#if $COMMAND successful: Write-Output "$ACTION on $USER succeeded."
#if $COMMAND unsuccessful: Write-Output "$ACTION on $USER failed."

}
}

CodePudding user response:

$? won't work because even if the command fails, Invoke-Expression was invoked successfully.

Use the & call operator to invoke the call directly instead, and $? will work. For the conditional parameter argument, use splatting!

foreach ($x in Get-Content $pathfile\inputfile.txt) {
    $user,$action,$null = $x.Split(',')

    # construct command name
    $command = "$ACTION-DistributionGroupMember"

    # organize the parameter arguments in a hashtable for splatting later
    $paramArgs = @{
        Identity = 'Group Name'
        Member   = $USER
    }
    
    # conditionally add the `-Confirm` parameter
    if ($ACTION -ieq "remove") {
        $paramArgs['Confirm'] = $false
    }

    # invoke the command with the call operator
    & $command @paramArgs

    if($?){
        # command invocation suceeded
    }
    else {
        # command invocation failed
    }
}
  • Related