我想实现一个输出一些调试信息的函数。 我希望函数,即“Write-Foo”,以下列方式工作:
Write-Foo $SomeThing
# the output will be "SomeThing: (the value of Something)"
是否可以实现此功能?我不知道如何获取函数参数的名称。
由于
答案 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建议将其写入调试流,这样你就不会用它来污染管道。