function test
{
    [CmdletBinding()]
    param
    (
        [Parameter(
            Mandatory = $true,
            ParameterSetName = "MyArgument"
        )]
        [ValidateSet("Value1", "Value2")]
        [string[]]
        $MyArguments
    )
    foreach ($MyArgument in $MyArguments)
    {
        switch ($MyArgument)
        {
            Value1
            {
                write-host "$parameter used"
            }
            Value2
            {
                write-host "$parameter used"
            }
        }
    }
}
test -MyArgument Value1, Value2
How to get the actual argument passed by parameter if we use switch? I tried to catch it by $MyInvocation.BoundParameters.Values and $PSCmdlet.MyInvocation.InvocationName, but failed.
I want to get instead of a variable $parameter Value1 if we call Value1, and Value2 if we call Value2, but all approaches receive all values at once.
Thanks in advance.
function test
{
    [CmdletBinding()]
    param
    (
        [Parameter(
            Mandatory = $true,
            ParameterSetName = "MyArgument"
        )]
        [ValidateSet("Value1", "Value2")]
        [string[]]
        $MyArguments
    )
    foreach ($MyArgument in $MyArguments)
    {
        switch ($MyArgument)
        {
            Value1
            {
                write-host "$parameter used"
            }
            Value2
            {
                write-host "$parameter used"
            }
        }
    }
}
test -MyArgument Value1, Value2
How to get the actual argument passed by parameter if we use switch? I tried to catch it by $MyInvocation.BoundParameters.Values and $PSCmdlet.MyInvocation.InvocationName, but failed.
I want to get instead of a variable $parameter Value1 if we call Value1, and Value2 if we call Value2, but all approaches receive all values at once.
Thanks in advance.
Because you're using a foreach loop in your function, the current argument can be represented as $MyArgument, however the item you're switching on is always represented as $_ or $PSItem in the action script block, so in this case both options are valid:
Write-Host "$MyArgument used"
# or
Write-Host "$_ used"
Something worth noting about switch in PowerShell is that it can also enumerate collections, so you can also get rid of your loop and this becomes valid code too:
function test {
    [CmdletBinding()]
    param(
        [Parameter(
            Mandatory = $true,
            ParameterSetName = 'MyArgument'
        )]
        [ValidateSet('Value1', 'Value2')]
        [string[]] $MyArguments
    )
    switch ($MyArguments) {
        Value1 {
            Write-Host "$_ used"
        }
        Value2 {
            Write-Host "$_ used"
        }
    }
}
test -MyArguments Value1, Value2
Relevant docs:

Write-Host "$_ used"orWrite-Host "$MyArgument used"? You're switching on$MyArgument, the value you're switching on can be represented as$_in the action block of a switch statement. – Santiago Squarzon Commented Jan 2 at 17:28$MyInvocation, Get-Command -Name $MyInvocation.MyCommand, Get-PSCallStack $MyInvocation.BoundParameters.Values, $PSCmdlet.MyInvocation.InvocationName, $ParameterList = (Get-Command -Name $MyInvocation.MyCommand).Parameters, $ParameterList["Variable"].Attributes.ValidValues– Sanctuary Commented Jan 2 at 17:52