如何从 Powershell 函数返回多个项

How to return several items from a Powershell function

提问人:sbi 提问时间:9/27/2012 更新时间:10/17/2023 访问量:107989

问:

在一个脚本中,我有几个函数需要分解SVN外部定义。这些可以是 、 或 ,我想出的提取数据的机制不仅仅是两行,所以我想把它放到一个单独的函数中。<url> <path>-r<rev> <url> <path>-r <rev> <url> <path>

但是当我这样做时,我最终会得到三个包含函数本地相关数据的变量,并且我认为没有办法将它们全部提供给调用者。

在适当的编程语言中,我会返回一个包含所有三个值的复合类型,但我不明白如何在 Powershell 中做到这一点。当然,我可以将其拆分为三个单独的函数,但随后我又回到了违反 DRY 规则的问题。

那么,我可以在 Powershell 中做什么呢?

PowerShell的

评论


答:

4赞 CB. 9/27/2012 #1

您可以返回一个数组,然后让调用方拆分它或返回一个自定义对象,并且调用方始终执行拆分。[string]

评论

0赞 sbi 9/27/2012
哦,那个自定义对象的东西看起来和我需要的完全一样!
21赞 OutOfThisPlanet 5/30/2018
这里缺少一个示例,这将很有用。
0赞 chenchuk 11/10/2023
示例如下:byteinthesky.com/powershell/...
103赞 JPBlanc 9/27/2012 #2

我同意@Christian,我添加了另一个解决方案。

首先,您可以显式或隐式地使用数组返回:

  1. 明确地

    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. 隐 式

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

其次,您可以返回一个自定义对象:

  1. 简写形式

    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. 学校形式

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

第三,通过引用使用参数:

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赞 sbi 9/27/2012
啊,你可以通过引用传递参数!我不知道。谢谢!
1赞 Keith Hill 9/28/2012
请注意,没有必要使用上述示例中的语句。 在 PowerShell 中,通常仅用于更改函数的正常退出点。returnreturn
4赞 JPBlanc 9/28/2012
这是你的观点,我尊重它。我的观点是使函数代码更具可读性,而且在我的代码中,我从不在函数中使用 Write-Output。我存在关于结构化编程的旧规则,我试图应用这些规则return $value
0赞 sbi 9/29/2012
@JPBlanc:谢谢你的全面回答。我接受了另一个答案,thouqh,因为克里斯蒂安是第一个,我最终按照他的建议做了(使用自定义对象)。
2赞 Dave Potts 4/14/2020
谁能解释一下为什么你需要逗号。来自 PowerShell 以外的语言,我不明白为什么需要逗号(尽管通过测试我同意它是!return ,$myArray
40赞 eythort 7/3/2015 #3

也许我误解了这个问题,但这不就是返回变量列表那么简单吗,调用者只是将每个变量分配给一个变量。 那是

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

$a 将是一个数组,$b字母“b”

> $a 
a
c
> $b
b

评论

0赞 jreed121 12/2/2023
被低估的答案。这绝对是最干净的解决方案。