如何在powershell函数中获取参数名称

时间:2014-03-28 03:36:16

标签: powershell

我想实现一个输出一些调试信息的函数。 我希望函数,即“Write-Foo”,以下列方式工作:

Write-Foo $SomeThing
# the output will be "SomeThing: (the value of Something)"

是否可以实现此功能?我不知道如何获取函数参数的名称。

由于

5 个答案:

答案 0 :(得分:2)

这接近你想要的:

function Write-Foo($varName)
{
    $varVal = $ExecutionContext.InvokeCommand.ExpandString("`$variable:$varName")
    Write-Host "$($varName): $varVal"
}

尝试一下:

PS> $SomeThing = 'hello'
PS> Write-Foo SomeThing
SomeThing: hello

答案 1 :(得分:2)

另一种观点:

function Write-Foo($varName)
{
    $v = Get-Variable $varName
    Write-Host ($v.Name + ": " + $v.Value)
}

结果:

PS C:\> $Something = "nothing"            
PS C:\> Write-Foo SomeThing               
Something: nothing

答案 2 :(得分:1)

你可以定义一个这样的函数:

function Write-Foo($msg) {
  Write-Host ("SomeThing: {0}" -f $msg)
}

或(如果您希望输出可用于进一步处理),如下所示:

function Write-Foo($msg) {
  "SomeThing: {0}" -f $msg
}

但是,由于您说要输出调试信息,因此使用现有的Write-Debug cmdlet可能是更好的方法:

PS C:\> Write-Debug 'foo'
PS C:\> $DebugPreference
SilentlyContinue
PS C:\> $DebugPreference = 'Continue'
PS C:\> Write-Debug 'foo'
DEBUG: foo

答案 3 :(得分:1)

您可以通过$MyInvocation.BoundParameters访问该功能的参数,这可能是您想要的:

function Write-Foo($varName) {
    foreach ($key in $MyInvocation.BoundParameters.Keys) {
        Write-Verbose ("{0}: {1}" -f ($key, $MyInvocation.BoundParameters[$key])) -Verbose
    }
}
Write-Foo "Hello"

,输出如下:

VERBOSE: varName: Hello

如果您希望能够控制何时出现调试信息,可以将其转换为cmdlet:

function Write-Foo {
[CmdletBinding()]
Param ($varName)
    foreach ($key in $MyInvocation.BoundParameters.Keys) {
        Write-Verbose ("{0}: {1}" -f ($key, $MyInvocation.BoundParameters[$key]))
    }
}
Write-Foo "Hello"
Write-Foo "This will debug" -Verbose

并且第一个调用不产生输出,而第二个调用将显示:

VERBOSE: Verbose: True
VERBOSE: varName: This will debug

当然,您可以选择输出调试信息的准确方式。可能Write-Debug(通常会提示每行输出)或Write-Verbose(通常被抑制)都适用于此。

答案 4 :(得分:1)

另一种可能性(假设您要显示的是作为参数传递的变量的名称,而不是传递给它的参数的名称。)

function Write-Foo($varName)
{
  $var = 
  ($MyInvocation.line -replace '\s*write-foo\s*\$','').trim()

  '{0}: {1}' -f $var,$varName
}

$something =  'Hello'

write-foo $something
something: Hello

如果您在没有$

的情况下传递名称,则会更容易
function Write-Foo($varName)
{
  $var = Get-Variable $varName 
  '{0}: {1}' -f $var.Name,$var.Value 
}

$something =  'Hello'

write-foo something
something: Hello

我也是第二个@Ansgar Weicher建议将其写入调试流,这样你就不会用它来污染管道。