我想實現一個函數來輸出一些調試信息。 我想要的功能,即「寫富」,在下面的方式工作:如何在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
(通常會被抑制),在這裏可能是合適的。