В powershell получение аргументов перед вызовом функции после вызова param?

#powershell

Вопрос:

Допустим, у меня есть функция, которую я вызываю следующим образом:

 myfunction -msg1 'this is message 1'  -msg2 'this is message2'
 

И вот моя функция:

 function myfunction {
    param([string]$msg1, [string]$msg2)

    #HOW WOULD I Get the pre-invocation argument the function here? that is:
    $preinvoke = @( "-msg1", 'this is message 1', '-msg2', 'this is message2')

    write-host "You called this command like this: myfunction $preinvoke"
}   
     
 

Есть ли способ автоматически установить $preinvoke на основе реальных флагов функции после вызова параметра? У меня сложилось впечатление, что парам съедает все аргументы… Мне нужен список аргументов перед вызовом функции после вызова param.

Комментарии:

1. «Мне нужен список аргументов перед вызовом»-почему?

2. $PSBoundParameters или $MyInvocation.BoundParameters должен дать вам то, что вы ищете.

Ответ №1:

Используйте $MyInvocation автоматическую переменную:

 function Test-Invocation
{
  param([string]$msg1, [string]$msg2)

  # $MyInvocation.Line will give you the originating call
  $originalInvocation = $MyInvocation.Line
  Write-Host "Original invocation: ${originalInvocation}"

  # Which you can then parse/tokenize again if need be
  $tokens = @()
  $AST = [System.Management.Automation.Language.Parser]::ParseInput($originalInvocation, [ref]$tokens, [ref]$null)

  Write-Host "Original Invocation contains the following tokens:"
  foreach($token in $tokens){
    Write-Host ("  {0,15} (flags: {1,20}): '{2}'" -f $token.Kind,$token.TokenFlags,$token.Text)
  }
}
 

Затем используйте/протестируйте вот так:

 PS ~> Test-Invocation -msg1 'this is message 1'  -msg2 'this is message2'
Original Invocation contains the following tokens:
          Generic (flags:          CommandName): 'Test-Invocation'
        Parameter (flags:                 None): '-msg1'
    StringLiteral (flags:   ParseModeInvariant): ''this is message 1''
        Parameter (flags:                 None): '-msg2'
    StringLiteral (flags:   ParseModeInvariant): ''this is message2''
       EndOfInput (flags:   ParseModeInvariant): ''