#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): ''