我想实现一个函数来输出一些调试信息。 我想要的功能,即“写富”,在下面的方式工作:如何在powershell函数中获取参数名称
Write-Foo $SomeThing
# the output will be "SomeThing: (the value of Something)"
是否有可能实现这个功能呢?我不知道如何获取函数的参数名称。
感谢
我想实现一个函数来输出一些调试信息。 我想要的功能,即“写富”,在下面的方式工作:如何在powershell函数中获取参数名称
Write-Foo $SomeThing
# the output will be "SomeThing: (the value of Something)"
是否有可能实现这个功能呢?我不知道如何获取函数的参数名称。
感谢
另一种可能性(这里假设你想要显示的是作为参数传递的变量的名称,而不是传递给它的参数的名称)。
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的建议。
你想要什么这是接近:
function Write-Foo($varName)
{
$varVal = $ExecutionContext.InvokeCommand.ExpandString("`$variable:$varName")
Write-Host "$($varName): $varVal"
}
想出来:
PS> $SomeThing = 'hello'
PS> Write-Foo SomeThing
SomeThing: hello
你可以这样定义一个函数:
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
另一个采取:
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
您可以通过$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
(通常会被抑制),在这里可能是合适的。