2014-03-28 2 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" 
} 

그것을 밖으로 시도 :

function Write-Foo($msg) { 
    Write-Host ("SomeThing: {0}" -f $msg) 
} 

:

PS> $SomeThing = 'hello' 
PS> Write-Foo SomeThing 
SomeThing: hello 
1

는이 같은 함수를 정의 할 수 있습니다 또는 (outpu를 원한다면 t이 같은) 추가 처리를 위해 사용할 수 그러나

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 (일반적으로 표시되지 않음)이 여기에 적합합니다.

관련 문제