强制 Powershell 函数返回数组

Evi*_*cat 1 powershell types return function


如何强制 Powershell 函数返回数组?
这个简单的函数例如,如果“C:\Newfolder”仅包含 1 个元素,则它不会返回数组。

function Get-AlwaysArray
{
    $returnArray = gci "C:\New folder"
    Write-Output $returnArray
}
(Get-AlwaysArray).Gettype()
Run Code Online (Sandbox Code Playgroud)

已经有一个线程在这里有一个非常好的赞成答案,但不幸的是,没有一个答案有效。
这是我尝试过的:

function Get-AlwaysArray {
    [Array]$returnArray = gci "C:\New folder"
    Write-Output $returnArray   
}
(Get-AlwaysArray).Gettype()

function Get-AlwaysArray {
    $returnArray = @(gci "C:\New folder")
    Write-Output @($returnArray)   
}
(Get-AlwaysArray).Gettype()

function Get-AlwaysArray {
    $returnArray = @(gci "C:\New folder")
    Write-Output @($returnArray | Where-Object {$_})   
}
(Get-AlwaysArray).Gettype()

function Get-AlwaysArray {
    [Object[]]$returnArray = @(gci "C:\New folder")
    Write-Output @($returnArray | Where-Object {$_})   
}
(Get-AlwaysArray).Gettype()
Run Code Online (Sandbox Code Playgroud)

唯一可行的方法是

function Get-AlwaysArray {
    $returnArray = gci "C:\New folder"
    Write-Output $returnArray 
}
@(Get-AlwaysArray).Gettype()
Run Code Online (Sandbox Code Playgroud)

但我不想在每次调用我的函数时添加这个。
我究竟做错了什么?

小智 10

首先,使用数组子表达式运算符@( ... )。该运算符以数组形式返回一个或多个语句的结果。如果只有一项,则数组只有一个成员。

$returnArray = @( Get-ChildItem "F:\PowerShell\A" )
Run Code Online (Sandbox Code Playgroud)

Write-Output与开关-NoEnumerate结合使用以防止 PowerShell 展开阵列。

Write-Output -NoEnumerate $returnArray
Run Code Online (Sandbox Code Playgroud)

您还可以使用Write-Output有效地获得相同的结果,而无需使用-NoEnumerate,方法是使用下面的语法。

Write-Output ,$returnArray
Run Code Online (Sandbox Code Playgroud)

$returnArray前面的逗号有效地创建一个新数组,并将$returnArray作为其唯一元素。然后,PowerShell 展开这个新的单元素数组,将原始$returnArray完整返回给调用者。