Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Returning ArrayList from Function/Script

Tags:

powershell

Given the following script:

function f {
    [CmdletBinding()]Param()
    Write-Verbose 'f: Start'
    $t = New-Object 'System.Collections.ArrayList'
    Write-Verbose $t.GetType().Name
    return $t
}

$things = New-Object 'System.Collections.ArrayList'
$things.GetType().Name
$things = f -verbose
$things.GetType().Name

Why wouldn't the $things be-of-type ArrayList at the final line?

like image 770
Adam Avatar asked Mar 06 '23 00:03

Adam


1 Answers

Outputting collections (not just arrays) causes PowerShell to enumerate them by default - i.e., the collection's elements are sent one by one to the success output stream.

  • If you collect these elements by capturing the output in a variable, you always get a regular PowerShell array ([object[]]), except if there's only one element, which is captured as-is.

To prevent that - i.e., to output a collection as a whole - use:

Write-Output -NoEnumerate $t

A shorter and more efficient, but less obvious alternative is to wrap the collection in an auxiliary single-element array with the unary form of ,, the array-construction operator, which causes PowerShell to enumerate the outer array and output the collection within as-is:

, $t    # implicit output, no Write-Output needed
like image 71
mklement0 Avatar answered Mar 16 '23 20:03

mklement0