2014-07-03 49 views
8

有没有办法清除函数内部的返回值,这样我可以保证返回值是我的意图?或者可能关闭该功能的行为?在Powershell函数中清除捕获的输出/返回值

在这个例子中,我希望返回值是包含一个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 

但是,输出包含的添加操作所捕获的值。

0 
1 
Hello 
World 

我觉得这是PowerShell的“特性”,很烦人,因为它使得它很容易只是通过调用另一个函数,你不知道返回的值打破你的功能。

更新

我知道有办法,以防止被捕获(如下面的答案之一描述)的输出,但需要你知道一个函数实际上返回一个值。如果你调用另一个Powershell函数,它可能会在将来有人改变这个函数返回一个值,然后它会破坏你的代码。

+1

你是如何处理这个问题的?这是powershell的非常烦人的功能,不允许控制返回值。 – Feru

+0

我刚刚到处使用[void]。我还决定在C#中执行复杂的事情更容易,然后使用PowerShell将它们粘合在一起。 – Mas

回答

6

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

$myArray.Add("Hello") | Out-Null 

$myArray.Add("Hello") >$null 

[void]$myArray.Add("Hello") 
+0

是的,我知道这一点,但这意味着我必须将每个函数调用的输出都设为null以确保我的输出没有被破坏,这是一个巨大的痛苦。如果我忘了这样做,并且代码有效,将来可能会有人更改PowerShell功能并打破另一个功能。 – Mas

+1

看来答案是,这个问题没有解决方案,除了排除每个函数调用,这是非常烦人的。 – Mas

0

为什么不使用Powershell Array对象,而不是.Net arrayList?

你可以这样做:

function GetArray() { 
    # set $myArray as a powershell array 
    $myArray = @() 
    $myArray+="Hello" 
    $myArray+="World" 
    # [email protected]("Hello", "World") would work as well 

    return $myArray 
} 

这将返回一个 “干净” 的阵列,符合市场预期。

如果你真的需要得到一个System.collections.ArrayList,你能做到这一点,2步:

  • 创建一个PowerShell阵列上方
  • 的解释转换您的PowerShell阵列在.NET ArrayList中这样说:

    # Get the powershellArray 
    $x = getArray 
    # Create a .Net ArrayList 
    $myArrayList = New-Object System.Collections.ArrayList 
    # Fill your arraylist with the powershell array 
    $myArrayList.AddRange($x) 
    

希望这有助于一点。

+2

问题中的代码只是不良行为的一个例子。总的来说,我一直在问如何处理这种情况。 – Mas

2

我也有这个完全相同的挫折!我有一个函数,其中一个变量应该计数$ <variablename> ++

除了。我在一次迭代中最后忘记了“++”。这是导致变量的值被发送到输出缓冲区。这是非常加重和耗时找到! MS应至少提供了在用户分配所需返回值之前刷新输出缓冲区的功能。 Anywhew ...我相信我有一个解决方法。

由于我在函数的末尾分配了一个返回值,我的期望值将始终是输出缓冲区数组的最后一项。所以我改变了我叫我从功能的方式:

If (FunctionName (parameters)) {} 

要:

If ((FunctionName (parameters))[-1]) {} 

我的特定情况咬我,当我试图捕捉功能$返回False。由于上面的输入错误,我的IF语句将其视为true,因为输出中存在垃圾,即使我的最后一个函数输出为“Return $ False”。从函数分配的最后一个输出是$ False值,这是由于输入错误导致计算错误导致的问题。 因此改变我的函数返回评价:

If (!((FunctionName (parameters))[-1])) {#something went wrong!} 

做的伎俩让我只评价输出数组的最后一个元素。我希望这可以帮助别人。

+0

如果您希望获得单一的返回值,这是一个不错的窍门。我会牢记这一点。 – Mas

+0

注意,当你有一个散列表的单个返回值时,这不起作用 - 你会尝试索引到这个散列表。解决方案:将函数调用作为'array'('FunctionName(parameters))'作为前缀来强制结果是一个返回值数组。然后这将包含您的散列表在预期的索引。 –

2

只是想发布这个以防万一它有帮助。我有多个功能,我打电话。每个函数返回一个0或1.我用它来看看是否一切正常。

所以基本上...

function Funct1 
{ 
    # Do some things 
    return 1 
} 

$myResult += Funct1 
$myResult += Funct2 
$myResult += Funct3 
if ($myResult -eq 3) { "All is good" } 

一切相处得去,直到我补充说,有一些拷贝项目和命令等功能。

长话短说和一两个小时我永远不会回来,我发现这个同样的问题,这个管道管道的事情。无论如何,在这样的网站帮助下,我找到了最简洁的方法来确保你获得你的“回报”,而不是别的。

$myResult += Funct1 -split " " | Select-Object -Last 1 
$myResult += Funct2 -split " " | Select-Object -Last 1 
$myResult += Funct3 -split " " | Select-Object -Last 1 
0

我遇到了同样的问题。在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" 
2

使用从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]