How to return several items from a Powershell function

In a script I have several functions that need to break down an SVN external definition. These can either be <url> <path>, -r<rev> <url> <path>, or -r <rev> <url> <path>, and the mechanics I came up with to extract the data is more than just two lines, so I want to put this into a separate function.

But when I do so, I end up with three variables containing the relevant data which are local to the function, and I see no way to get all three of them them to the caller.

In a proper programming language I would return a compound type containing all three values, but I don't see how to do that in Powershell. Of course, I could split this into three separate functions, but then I am back at violating the DRY rule.

So what can I do here in Powershell?

0

3 Answers

I agree with @Christian, and I add another solution.

First you can return using an array explicitly or implicitly:

  1. explicitly

    function ExplicitArray ()
    { $myArray = @() $myArray += 12 $myArray += "Blue" return ,$myArray
    }
    Clear-Host
    $a = ExplicitArray
    Write-Host "values from ExplicitArray are $($a[0]) and $($a[1])"
  2. implicitly

    function ImplicitArray ()
    { Write-Output 12 Write-Output "Blue" return "green"
    }
    $b = ImplicitArray
    Write-Host "values from ImplicitArray are $($b[0]), $($b[1]) and $($b[2])"

Second you can return a custom object:

  1. Short form

    function ReturnObject ()
    { $value = "" | Select-Object -Property number,color $value.Number = 12 $value.color = "blue" return $value
    }
    $c = ReturnObject
    Write-Host "values from ReturnObject are $($c.number) and $($c.color)"
  2. School form

    function SchoolReturnObject ()
    { $value = New-Object PsObject -Property @{color="blue" ; number="12"} Add-Member -InputObject $value –MemberType NoteProperty –Name "Verb" –value "eat" return $value
    }
    $d = SchoolReturnObject
    Write-Host "values from SchoolReturnObject are $($d.number), $($d.color) and $($d.Verb)"

Third using argument by reference:

function addition ([int]$x, [int]$y, [ref]$R)
{ $Res = $x + $y $R.value = $Res
}
$O1 = 1
$O2 = 2
$O3 = 0
addition $O1 $O2 ([ref]$O3)
Write-Host "values from addition $o1 and $o2 is $o3"
9

Maybe I am misunderstanding the question but isn't this just as simple as returning a list of variables, and the caller simply assigns each to a variable. That is

> function test () {return @('a','c'),'b'}
> $a,$b = test

$a will be an array, and $b the letter 'b'

> $a
a
c
> $b
b
1

You can return an array of [string] and then let the caller split it or return a custom object and always the caller do the split.

3

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like