Return PowerShell 中具有单个元素的数组
Return array with single element in PowerShell
这应该非常简单 - 我需要 return 来自函数的哈希表数组。这在有多个散列表时有效,但当只有一个散列表时,结果不是数组。我宁愿不测试结果是否为数组。
function GetArrayWith1Hashtable()
{
$array = @()
$hashtable = @{}
$hashtable["a"] = "a"
$hashtable["b"] = "b"
$hashtable["c"] = "c"
$array += $hashtable
Write-Host "GetArrayWith1Hashtable array.Length =" $array.Length
Write-Host "GetArrayWith1Hashtable array.Count" $array.Count
Write-Host "GetArrayWith1Hashtable array[0].Keys" $array[0].Keys
$array
}
function GetArrayWith2Hashtables()
{
$array = @()
$hashtable = @{}
$hashtable["a"] = "a"
$hashtable["b"] = "b"
$hashtable["c"] = "c"
$array += $hashtable
$hashtable2 = @{}
$hashtable2["d"] = "d"
$hashtable2["e"] = "e"
$hashtable2["f"] = "f"
$array += $hashtable2
Write-Host "GetArrayWith2Hashtables array.Length = " $array.Length
Write-Host "GetArrayWith2Hashtables array.Count = " $array.Count
Write-Host "GetArrayWith2Hashtables array[0].Keys =" $array[0].Keys
Write-Host "GetArrayWith2Hashtables array.Count = "$array[1].Keys
$array
}
$result1 = GetArrayWith1Hashtable
# $result1.Length - not available
Write-Host "Result of GetArrayWith1Hashtable result1.Count = " $result1.Count # Count = 2 (would expect this to be 1)
# $result1[0] not available - not an array
$result2 = GetArrayWith2Hashtables
Write-Host "Result of GetArrayWith2Hashtables result2.Length = " $result2.Length # Length = 2
Write-Host "Result of GetArrayWith2Hashtables result2.Count = " $result2.Count # Count = 2
Write-Host "Result of GetArrayWith2Hashtables result2[0].Keys = " $result2[0].Keys # Keys = c a b
Write-Host "Result of GetArrayWith2Hashtables result2[1].Keys = " $result2[1].Keys # Keys = d e f
<#
FULL OUTPUT:
GetArrayWith1Hashtable array.Length = 1
GetArrayWith1Hashtable array.Count 1
GetArrayWith1Hashtable array[0].Keys c a b
Result of GetArrayWith1Hashtable result1.Count = 2
GetArrayWith2Hashtables array.Length = 2
GetArrayWith2Hashtables array.Count = 2
GetArrayWith2Hashtables array[0].Keys = c a b
GetArrayWith2Hashtables array.Count = d e f
Result of GetArrayWith2Hashtables result2.Length = 2
Result of GetArrayWith2Hashtables result2.Count = 2
Result of GetArrayWith2Hashtables result2[0].Keys = c a b
Result of GetArrayWith2Hashtables result2[1].Keys = d e f
#>
只需将 return 类型转换为数组:
$result1 = @(GetArrayWith1Hashtable)
实际上,您只需在 returned 项目前添加逗号即可。这告诉 PowerShell 按原样 return 它,而不是试图聪明地对待它。这也允许您在一个地方修复它,而不是在它被调用的所有地方。
function GetArrayWith1Hashtable()
{
$array = @()
$hashtable = @{}
$hashtable["a"] = "a"
$hashtable["b"] = "b"
$hashtable["c"] = "c"
$array += $hashtable
Write-Host "GetArrayWith1Hashtable array.Length =" $array.Length
Write-Host "GetArrayWith1Hashtable array.Count" $array.Count
Write-Host "GetArrayWith1Hashtable array[0].Keys" $array[0].Keys
# The only edit was to add the comma below
,$array
}
更新: 虽然,我认为您不需要此功能,但我会提及它,以便其他人能够理解其中的区别并为他们的方法做出明智的选择。
为了使您的函数兼容以便在管道中更有效地使用,更好的方法是为每个项目调用 Write-Output。
function GetArrayWith1Hashtable()
{
Write-Output "a"
Write-Output "b"
Write-Output "c"
}
通过使用 Write-Output,您允许 PowerShell 调用下一个命令的 Process block in the pipeline, individually for each object. Otherwise it would call the next command and pass a single array object to it. You can read more about piping objects here
这应该非常简单 - 我需要 return 来自函数的哈希表数组。这在有多个散列表时有效,但当只有一个散列表时,结果不是数组。我宁愿不测试结果是否为数组。
function GetArrayWith1Hashtable()
{
$array = @()
$hashtable = @{}
$hashtable["a"] = "a"
$hashtable["b"] = "b"
$hashtable["c"] = "c"
$array += $hashtable
Write-Host "GetArrayWith1Hashtable array.Length =" $array.Length
Write-Host "GetArrayWith1Hashtable array.Count" $array.Count
Write-Host "GetArrayWith1Hashtable array[0].Keys" $array[0].Keys
$array
}
function GetArrayWith2Hashtables()
{
$array = @()
$hashtable = @{}
$hashtable["a"] = "a"
$hashtable["b"] = "b"
$hashtable["c"] = "c"
$array += $hashtable
$hashtable2 = @{}
$hashtable2["d"] = "d"
$hashtable2["e"] = "e"
$hashtable2["f"] = "f"
$array += $hashtable2
Write-Host "GetArrayWith2Hashtables array.Length = " $array.Length
Write-Host "GetArrayWith2Hashtables array.Count = " $array.Count
Write-Host "GetArrayWith2Hashtables array[0].Keys =" $array[0].Keys
Write-Host "GetArrayWith2Hashtables array.Count = "$array[1].Keys
$array
}
$result1 = GetArrayWith1Hashtable
# $result1.Length - not available
Write-Host "Result of GetArrayWith1Hashtable result1.Count = " $result1.Count # Count = 2 (would expect this to be 1)
# $result1[0] not available - not an array
$result2 = GetArrayWith2Hashtables
Write-Host "Result of GetArrayWith2Hashtables result2.Length = " $result2.Length # Length = 2
Write-Host "Result of GetArrayWith2Hashtables result2.Count = " $result2.Count # Count = 2
Write-Host "Result of GetArrayWith2Hashtables result2[0].Keys = " $result2[0].Keys # Keys = c a b
Write-Host "Result of GetArrayWith2Hashtables result2[1].Keys = " $result2[1].Keys # Keys = d e f
<#
FULL OUTPUT:
GetArrayWith1Hashtable array.Length = 1
GetArrayWith1Hashtable array.Count 1
GetArrayWith1Hashtable array[0].Keys c a b
Result of GetArrayWith1Hashtable result1.Count = 2
GetArrayWith2Hashtables array.Length = 2
GetArrayWith2Hashtables array.Count = 2
GetArrayWith2Hashtables array[0].Keys = c a b
GetArrayWith2Hashtables array.Count = d e f
Result of GetArrayWith2Hashtables result2.Length = 2
Result of GetArrayWith2Hashtables result2.Count = 2
Result of GetArrayWith2Hashtables result2[0].Keys = c a b
Result of GetArrayWith2Hashtables result2[1].Keys = d e f
#>
只需将 return 类型转换为数组:
$result1 = @(GetArrayWith1Hashtable)
实际上,您只需在 returned 项目前添加逗号即可。这告诉 PowerShell 按原样 return 它,而不是试图聪明地对待它。这也允许您在一个地方修复它,而不是在它被调用的所有地方。
function GetArrayWith1Hashtable()
{
$array = @()
$hashtable = @{}
$hashtable["a"] = "a"
$hashtable["b"] = "b"
$hashtable["c"] = "c"
$array += $hashtable
Write-Host "GetArrayWith1Hashtable array.Length =" $array.Length
Write-Host "GetArrayWith1Hashtable array.Count" $array.Count
Write-Host "GetArrayWith1Hashtable array[0].Keys" $array[0].Keys
# The only edit was to add the comma below
,$array
}
更新: 虽然,我认为您不需要此功能,但我会提及它,以便其他人能够理解其中的区别并为他们的方法做出明智的选择。
为了使您的函数兼容以便在管道中更有效地使用,更好的方法是为每个项目调用 Write-Output。
function GetArrayWith1Hashtable()
{
Write-Output "a"
Write-Output "b"
Write-Output "c"
}
通过使用 Write-Output,您允许 PowerShell 调用下一个命令的 Process block in the pipeline, individually for each object. Otherwise it would call the next command and pass a single array object to it. You can read more about piping objects here