Как вернуть несколько элементов из функции Powershell

В script у меня есть несколько функций, которые должны разрушить внешнее определение SVN. Они могут быть <url> <path>, -r<rev> <url> <path> или -r <rev> <url> <path>, а механика, которую я придумал для извлечения данных, - это не просто две строки, поэтому я хочу включить ее в отдельную функцию.

Но когда я это делаю, я получаю три переменные, содержащие соответствующие данные, которые являются локальными для этой функции, и я не вижу способа получить их все три к вызывающему.

В правильном языке программирования я бы возвращал составной тип, содержащий все три значения, но я не вижу, как это сделать в Powershell. Конечно, я мог бы разделить это на три отдельные функции, но потом я снова нарушу правило DRY.

Так что я могу сделать здесь, в Powershell?

Ответ 1

Вы можете вернуть массив [string], а затем позволить вызывающему абоненту разделить его или вернуть пользовательский объект, и всегда вызывающий выполняет разделение.

Ответ 2

Я согласен с @Christian, и я добавляю другое решение.

Сначала вы можете вернуться с использованием массива явно или неявно:

A) явно

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) неявно

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

Второй вы можете вернуть пользовательский объект:

A) Короткая форма

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

B) Школьная форма

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

Третий с использованием argumen по ссылке

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"

Ответ 3

Возможно, я не понимаю вопрос, но не так просто, как возвращать список переменных, а вызывающий просто присваивает каждому переменную. Это

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

$a будет массивом, а $b - буквой 'b'

> $a 
a
c
> $b
b