Velvet Star Monitor

Standout celebrity highlights with iconic style.

general

How to return several items from a Powershell function

Writer Mia Lopez

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.