2014-03-28 99 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(通常會被抑制),在這裏可能是合適的。

相關問題