2010-02-15 5 views
0

사용자 지정 Powershell 함수를 사용하면 모든 함수 출력이 반환됩니다. 난 그냥 $ true 또는 $ false를 반환합니다 래퍼 함수를 ​​작성하여 그 한계/혼란을 제거하려고합니다.Powershell - 동적 함수 호출

그러나 동적 함수 호출에 어려움을 겪고 있습니다. . . 구체적으로 인수를 전달합니다.

함수 이름과 함수 인수는 모두 "ExecBoolean"에 전달됩니다.

코드 샘플 :

# Simplifies calls to boolean functions in Powershells scripts 
# Helps solve this problem -> http://www.vistax64.com/powershell/107328-how-does-return-work-powershell-functions.html 

function Foo([string]$sTest, [int] $iTest) 
{ 
    Write-Host "sTest [" $sTest "]." 
    Write-Host "iTest [" $iTest "]." 
    if ($iTest -eq 1) 
    { 
     return $true 
    } 
    else 
    { 
     return $false 
    } 
} 

function ExecBoolean ([string] $sFunctionName, [array] $oArgs) 
{ 
    Write-Host "Array Length = " $oArgs.Length ", Items = [" $oArgs[0..($oArgs.Length - 1)] "]" 

    $oResult = & $sFunctionName $oArgs[0..($oArgs.Length - 1)] 

    # Powershell returns all function output in oResult, just get the last item in the array, if necessary.      
    if ($oResult.Length -gt 0) 
    { 
     return $oResult[$oResult.Length - 1] 
    } 
    else 
    { 
     return $oResult 
    } 
} 

$oResult = ExecBoolean "Foo" "String1", 1 

Write-Host "Result = " $oResult 

전류 출력 :

Array Length = 2 , Items = [ String1 1 ] 
sTest [ String1 1 ]. 
iTest [ 0 ]. 
Result = False 

원하는 출력 :

Array Length = 2 , Items = [ String1 1 ] 
sTest [ String1 ]. 
iTest [ 1 ]. 
Result = True 

는 파워 쉘 v1.0을이 수 있습니까?

감사합니다. 여기

답변

0
$oResult = & $sFunctionName $oArgs[0..($oArgs.Length - 1)] 

당신은 0Foo 기본적으로 그렇게 두 번째 매개 변수를 array- -an 기능을 하나 개의 인수를 전달하고 있습니다.

성명/표현식의 결과를 그냥 버리려는 경우, Out-Null으로 연결하거나 void으로 "전송"하는 등의 방법이 있습니다.

+0

감사합니다. 예, 무슨 일이 일어 났는지 이해합니다. 나는 $ oArgs [0 .. ($ oArgs.Length - 1)]가 배열로 간주되지 않고 0, 1, 2 등의 인수리스트로 생각할 것이라고 생각했다.// "out-null "트릭을하지만 개발자가 사용하지 않거나 어떤 명령문이 출력을 반환 하는지를 모르는 경우 발생하는 문제를 피하려고합니다. – MattH

2

이 같은 Invoke-Expression을 사용 :

function ExecBoolean ([string] $sFunctionName) 
{ 
    Write-Host "Array Length = " $args.Length ", Items = [" $args[0..($args.Length - 1)] "]" 
    $oResult = Invoke-Expression "$sFunctionName $($args -join ' ')" 
    # Powershell returns all function output in oResult, just get the last item in the array, if necessary.      
    if ($oResult.Length -gt 0) 
    { 
     return $oResult[$oResult.Length - 1] 
    } 
    else 
    { 
     return $oResult 
    } 
} 
ExecBoolean Foo String1 1 

참고 것을 :

  1. 나는 당신이 배열로 인수를 전달하지 않기 때문에, 이럴 더 편안 $args를 사용합니다. 그러나 $oArgs도 문제없이 사용할 수 있습니다 (문제가되는 유일한 줄은 Invoke-Expression입니다).
  2. 이것은 간단한 유형 (문자열, ints, ...)에서만 작동하지만 예를 들어. FileInfo인데, 이는 개체가 $($args -join ' ')의 문자열로 변환되기 때문입니다.
  3. 하나 더 옵션이 있지만 너무 길어서 ExecBoolean Foo @{sTest="String1"; iTest=1}입니다. 따라서 해시 테이블에 매개 변수를 전달합니다. 물론 해시 테이블을 사용하도록 Foo를 변경해야합니다. 이 경우에는 & 연산자를 사용하여 Foo를 호출 할 수 있기 때문에 모든 유형을 전달할 수 있습니다.
  4. 내가 때문에 한계,이 방법을 권하고 싶지 않다 (하지만 어쩌면 다른 사람이 더 나은 솔루션을 가지고 올 것이다 일어날 수)

아래를 참조하십시오.
Foo에서 출력이 반환되지 않도록하려면 Foo를 호출하는 다른 스크립트를 구문 분석하고 "Foo"에 대한 모든 호출 앞에 $null =을 추가해야하는지 확인하는 스크립트를 만들 수 있습니다.

PowerShell V2로 전환하면 더 좋은 표시 방법이 있습니다.추가 정보를 원하시면 개인적으로 How and Why to Use Splatting (passing [switch] parameters)

0

보면, 난 그냥 사용합니다 :

functionName -as [bool] 

이 부울로 함수의 결과를 강제 할 것이다.

나중에 더 읽을 수 있습니다.

희망이 있습니다.

+0

여러분의 경험에 따르면, 함수가 다른 출력을 가지고 있어도 불리언 결과를 안정적으로 강요합니까? – MattH