在Powershell函数中清除捕获的输出/返回值

Mas*_*Mas 13 powershell

有没有办法清除函数内部的返回值,所以我可以保证返回值是我想要的?或者可能关闭此功能的行为?

在这个例子中,我希望返回值是一个包含("Hello","World")的ArrayList

function GetArray() 
{
    # $AutoOutputCapture = "Off" ?
    $myArray = New-Object System.Collections.ArrayList
    $myArray.Add("Hello")
    $myArray.Add("World")

    # Clear return value before returning exactly what I want?
    return $myArray
}

$x = GetArray
$x
Run Code Online (Sandbox Code Playgroud)

但是,输出包含Add操作中捕获的值.

0
1
Hello
World
Run Code Online (Sandbox Code Playgroud)

我发现Powershell的这个"特性"非常烦人,因为它只是通过调用另一个你不知道返回值的函数来打破你的函数非常容易.

更新

我知道有一些方法可以防止输出被捕获(如下面的答案中所述),但这需要您知道函数实际返回一个值.如果您正在调用另一个Powershell函数,将来有人会更改此函数以返回一个值,这将破坏您的代码.

Fer*_*eru 7

我遇到了同样的问题。在 PS 中,函数将返回所有输出管道信息。| Out-Null函数中的其余代码变得棘手。我通过将返回变量作为参考参数传递来解决这个问题[ref]。这始终如一。检查下面的示例代码。注意:有些语法对于避免错误很重要。例如参数必须在括号中传递([ref]$result)

function DoSomethingWithFile( [ref]$result, [string]$file )
{
    # Other code writing to output
    # ....

    # Initialize result
    if (Test-Path $file){
        $result.value = $true
    } else {
        $result.value = $false
    }
}
$result = $null
DoSomethingWithFile ([ref]$result) "C:\test.txt" 
Run Code Online (Sandbox Code Playgroud)


小智 7

使用来自 user1654962 的信息,这是我解决此 PowerShell 问题的方法。因为,如果有输出信息,PowerShell 会将其作为数组返回,所以我决定确保函数输出始终是一个数组。然后调用行可以使用 [-1] 获取数组的最后一个元素,我们将获得一致的返回值。

function DoSomething()
{
  # Code that could create output
  Write-Output "Random output that we don't need to return"
  Write-Output "More random output"

  # Create the return value. It can be a string, object, etc.
  $MyReturnString = "ImportantValue"

  # Other code

  # Make sure the return value is an array by preceding it with a comma
  return ,$MyReturnString
}

$CleanReturnValue = ( DoSomething() )[-1]
Run Code Online (Sandbox Code Playgroud)


Raf*_*Raf 6

管道输出Out-Null,重定向输出$null或函数调用前缀[void]:

$myArray.Add("Hello") | Out-Null
Run Code Online (Sandbox Code Playgroud)

要么

$myArray.Add("Hello") >$null
Run Code Online (Sandbox Code Playgroud)

要么

[void]$myArray.Add("Hello")
Run Code Online (Sandbox Code Playgroud)

  • 似乎答案是除了排除每个函数调用之外,没有解决这个问题的方法,这非常烦人. (3认同)

小智 6

我也有同样的挫败感!我有一个函数,其中变量应该计数 $ <variablename>++

除了。我在一次迭代中忘记了最后的“++”。这导致变量的值被发送到输出缓冲区。查找起来非常麻烦且耗时!MS 至少应该提供在用户分配其所需的返回值之前刷新输出缓冲区的能力。无论如何...我相信我有办法解决。

由于我在函数末尾分配了一个返回值,因此我所需的值将始终是输出缓冲区数组的最后一个条目。所以我改变了调用函数的方式:

If (FunctionName (parameters)) {}
Run Code Online (Sandbox Code Playgroud)

到:

If ((FunctionName (parameters))[-1]) {}
Run Code Online (Sandbox Code Playgroud)

当我试图捕获函数 $False 返回时,我的特殊情况让我感到震惊。由于我上面的拼写错误,我的 IF 语句将其视为 true,因为输出中存在垃圾,即使我的最后一个函数输出是“Return $False”。由于拼写错误导致计算错误,函数最后分配的输出是 $False 值。因此,将我的函数返回评估更改为:

If (!((FunctionName (parameters))[-1])) {#something went wrong!}
Run Code Online (Sandbox Code Playgroud)

通过允许我仅评估输出数组的最后一个元素来实现这一点。我希望这对其他人有帮助。