2014-07-03 50 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]