【问题标题】:How to return several items from a Powershell function如何从 Powershell 函数返回多个项目
【发布时间】:2015-07-03 18:58:39
【问题描述】:

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

但是当我这样做时,我最终得到了三个包含函数本地相关数据的变量,我看不出有什么办法可以将这三个变量都传递给调用者。

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

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

【问题讨论】:

    标签: powershell


    【解决方案1】:

    我同意@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)"
    

    第三通过引用使用参数

    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"
    

    【讨论】:

    • 啊,你可以通过引用传递参数!我不知道。谢谢!
    • 请注意,以上示例中不必使用return 语句。 PowerShell 中的return 通常仅用于更改函数的正常退出点。
    • 这是你的观点,我尊重它。我的观点是return $value 使函数代码更具可读性,而且在我的代码中,我从不在函数中使用 Write-Output。我存在关于结构化编程的旧规则,我尝试应用这些规则
    • @JPBlanc:感谢您的全面回答。我已经接受了另一个答案,但是,因为 Christian 是第一个,我最终按照他的建议做了(使用自定义对象)。
    • 谁能解释为什么你需要return ,$myArray 中的逗号。来自 PowerShell 以外的语言,我不明白为什么需要逗号(尽管通过测试我同意它是!)
    【解决方案2】:

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

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

    $a 是一个数组,$b 是字母 'b'

    > $a 
    a
    c
    > $b
    b
    

    【讨论】:

    • 正是我需要的,非常感谢。解决方案越简单越好:)
    【解决方案3】:

    您可以返回一个[string] 的数组,然后让调用者拆分它或返回一个custom object,并且始终由调用者进行拆分。

    【讨论】:

    • 哦,那个自定义对象看起来和我需要的完全一样!
    • 这里缺少一个例子,这会很有用。
    猜你喜欢
    • 2014-04-23
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2015-01-06
    • 1970-01-01
    相关资源
    最近更新 更多