PowerShell从函数中获取结果

时间:2014-10-06 14:41:10

标签: powershell

我有以下代码,我尝试将字符串Good作为FooFunc的输出参数返回。

我该怎么做?

function FooFunc($a, [ref]$result){
    if (4 -gt 1) {
        $result = "Good"
        return $true
    } else {
        $result = "Bad"
        return $false
    }
}


try
{
    FooFunc "Bar" ([ref]$result)
    Write-Host $result
}
catch
{
    Write-Host $_.Exception.Message
}

编辑我不想使用return返回答案,我需要refparameters

3 个答案:

答案 0 :(得分:0)

你可以尝试

Function Foo{
  if(4 -gt 1)
  {
     return "Good"
  }
  else
  {
     return "Bad"
  }
}

try{
  $result = Foo
  Write-Output $result
}
catch{
   Write-Output "Some message"
}

答案 1 :(得分:0)

[ref]用于将变量传递给函数,因此它需要存在于当前作用域中,这就是您收到错误的原因。我认为你误解了用法。试试这个:

function FooFunc([ref]$result){
    if (4 -gt 1) {
        $result = 'good' + $result.value
        $result        
    } else {
        $result = "Bad"
        return $false
    }
}

try
{
    $result = 'badval'
    FooFunc ([ref]$result) 
}
catch
{
    Write-Host $_.Exception.Message
}

如果将函数传递给get-member,您将看到它返回ref并且输出正在使用您传入的变量。

答案 2 :(得分:0)

[ref]应用于参数将导致PSReference对象传递给函数。

对于function FooFunc($a, [ref]$result),使用$result = "Good"会将函数中的本地$result变量从PSReference更改为string,但会有对调用者传入的变量没有影响。要修改外部变量,您需要设置$result.Value = "Good"

作为Noah Sparks mentioned,在调用者方面,您还需要在将变量用作参数之前声明该变量。

function FooFunc( $a, [ref]$result ) {
    if( 4 -gt 1 ) {
        $result.Value = 'Good'  # change the reference value, not the variable
        return $true
    }
    else {
        $result.Value = 'Bad'
        return $false
    }
}


try {
    $result = $null  # declare variable before using it for a reference
    FooFunc 'Bar' ([ref]$result)
    Write-Host $result
}
catch {
    Write-Host $_.Exception.Message
}


<小时/>

另一种选择是从函数中输出多个值:

function FooFunc( $a ) {
    if( 4 -gt 1 ) {
        # Output both result and success values
        'Good'
        return $true
    }
    else {
        # This single return is the same as the output and return above
        return 'Bad', $false
    }
}


try {
    $result,$success = FooFunc 'Bar'  # Receive both values
    $success  # Implicitly output success value, as before
    Write-Host $result
}
catch {
    Write-Host $_.Exception.Message
}