2012-09-27 14 views
10

En un script tengo varias funciones que necesitan desglosar un SVN external definition. Estos pueden ser tanto <url> <path>, -r<rev> <url> <path> o -r <rev> <url> <path>, y la mecánica que se le ocurrió para extraer los datos es más que sólo dos líneas, así que quiero poner esto en una función separada.Cómo devolver varios elementos de una función de Powershell

Pero cuando lo hago, termino con tres variables que contiene los datos relevantes que son locales a la función, y no veo ninguna manera de conseguir los tres de ellos a la persona que llama.

En un lenguaje de programación adecuado que sería devolver un tipo de compuesto que contiene los tres valores, pero no veo cómo hacerlo en Powershell. Por supuesto, podría dividir esto en tres funciones separadas, pero luego volví a violar el DRY rule.

Entonces, ¿qué puedo hacer aquí en Powershell?

Respuesta

6

Puede devolver una matriz de [string] y luego dejar que la persona que llama lo divida o devuelva custom object y siempre que la persona que llama realice la división.

+0

Oh, esa cosa objeto personalizado se ve exactamente igual que lo que necesito! – sbi

48

Estoy de acuerdo con @Christian, y añadir otra solución.

Primera puede volver utilizando una matriz de forma explícita o implícitamente:

A) de forma explícita

function ExplicitArray() 
{ 
    $myArray = @() 

    $myArray += 12 
    $myArray += "Blue" 

    return ,$myArray 
} 

Clear-Host 
$a = ExplicitArray 
Write-Host "values from ExplicitArray are $($a[0]) and $($a[1])" 

B) implícitamente

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])" 

Segunda puede devolver un objeto personalizado :

A) Forma corta

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)" 

forma B) Escuela

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)" 

Tercer usando argumen por referencia

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" 
+2

¡Ah, puede pasar argumentos por referencia! No lo sabía. ¡Gracias! – sbi

+0

Tenga en cuenta que no es necesario utilizar las declaraciones 'return' en los ejemplos anteriores. 'return' en PowerShell normalmente solo se usa para alterar el punto de salida normal de una función. –

+3

Este es su punto de vista, lo respeto. Mi punto de vista es que 'return $ value' hace que el código de función sea más legible; además, en mi código, nunca uso el Write-Output en una función. Existo reglas antiguas sobre la programación estructurada, que intento aplicar – JPBlanc

5

Tal vez estoy no entender la pregunta, pero no es esto sólo tan simple como devolver una lista de variables, y la persona que llama simplemente asigna cada una a una variable. Eso es

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

$ A será una matriz, y $ b de la letra 'b'

> $a 
a 
c 
> $b 
b 
Cuestiones relacionadas