2014-03-28 124 views
0

我想实现一个函数来输出一些调试信息。 我想要的功能,即“写富”,在下面的方式工作:如何在powershell函数中获取参数名称

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

是否有可能实现这个功能呢?我不知道如何获取函数的参数名称。

感谢

回答

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的建议。

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

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

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
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 
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 

并且第一次调用不会产生ou而第二个会告诉你:

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

你当然可以选择如何输出调试信息。可能是Write-Debug(通常会提示输出的每行)或Write-Verbose(通常会被抑制),在这里可能是合适的。

相关问题