【问题标题】:Powershell: multidimensional array changes return value from "system.object[]"Powershell:多维数组从“system.object []”更改返回值
【发布时间】:2015-03-13 11:14:42
【问题描述】:

我想知道是否有人可以阐明我在通过函数从多维数组返回值时所面临的问题:

$ArrayList = @()

function MultiDimensionalArrayTest
{
    param(
        [array]$ArrayList
    )
    for($i = 0; $i -lt 1; $i++)
    {
                $ArrayModify += ,@("Test", "Test")
    }

    return $ArrayModify

}

$ArrayModify = MultiDimensionalArrayTest

foreach ($item in $ArrayModify)
{
    Write-Host $item[0]
}

当循环执行一次,返回的值为:

T
T

但是,如果 for 语句被循环两次,则返回的值为:

Test
Test

我的目标是从 Write-Host $item[0] 中检索 x 个值“Test”,无论语句执行多少次

如果在 $ArrayModify 数组中捕获并返回两行或多行,则该值为 system.object[],但是如果循环一次,则捕获值“Test, Test”,并且当 Write-Host $item[0] 被执行,它会打印 T。

任何建议将不胜感激。

【问题讨论】:

  • 您要么返回一个数组或字符串,要么返回一个数组数组。这里有什么困惑?
  • 您能否进一步解释您的脚本的全球目标是什么?
  • @EtanReisner OP 想知道他的第一个结果$ArrayModify 没有得到一个包含 1 个元素的数组。该元素是另一个数组。就目前而言,他得到了一个包含两个元素的数组,如您所知,它解释了输出。
  • @Matt Right 但我相信这只是 powershell 在返回时展开阵列。这是我最初的观点(尽管再看一遍我并没有说清楚)。
  • @EtanReisner 我也知道这一点。想不出防止这种情况的好方法。

标签: arrays powershell for-loop multidimensional-array


【解决方案1】:

不是最简洁的处理方式,但您需要防止 PowerShell 将单个元素数组展开为具有两个元素的数组。

function MultiDimensionalArrayTest{
    $ArrayModify = @()

    for($i = 0; $i -lt 1; $i++){
        $ArrayModify += ,@("Test$i", "Test$i$i")
    }

    ,@($ArrayModify)

}

我相信使用上述函数将获得所需的输出。 ,@($ArrayModify) 确保数组被返回,而不是像您在上面看到的那样展开到它的元素中。

$ArrayList = @()
$ArrayList = MultiDimensionalArrayTest

foreach ($item in $ArrayList){$item[0]}

在循环中为$i -lt 1 提供输出

Test0

在循环中为$i -lt 2 提供输出

Test0
Test1

你的输出

关于$i -lt 1 PowerShell 示例的输出,将数组展开为具有 2 个元素“Test”和“Test”的单维数组。您会看到字母“T”,因为所有字符串都支持数组索引,并且会从请求的位置返回字符。

其他代码问题

不要打死马,而是真正看看其他答案和 cmets,因为它们提供了一些关于您在问题中提供的代码的一些编码错误和异常的提示。

【讨论】:

  • 你需要那个if 测试吗?多阵列案例也正在正常展开,但随后又被卷回。不只是使用,@($ArrayModify) 返回总是有效(因为展开不会停止在一个级别)?
  • @EtanReisner 实际上,如果你这样做,它总是会返回一个单元素数组,这不是操作想要的。是我尝试的第一件事。会仔细检查以防万一......好吧,它确实如此。我发誓以前没有工作。感谢您确保我看起来不像个白痴。
【解决方案2】:

首先我注意到您的代码中有几个错误。

这行$ArrayList = @() 没有用,因为之后您不使用$ArrayList 变量。

关于 MultiDimensionalArrayTest 函数,您声明了一个 $ArrayList 参数,但您从未在函数中使用它。

最后当这条线没有意义时$ArrayModify = MultiDimensionalArrayTest = $item,你可能指的是$ArrayModify = MultiDimensionalArrayTest

【讨论】:

  • 没错,这就是为什么我要求(在评论中)进一步解释脚本的全球目标,希望我能够正确回答。
【解决方案3】:

这不是您问题的完整答案,因为我不确定您要达到的目标,但请看一下这一行:

$ArrayModify = MultiDimensionalArrayTest = $item

这是没有意义的,因为您正在调用函数 MultiDimensionalArrayTest 并向其传递两个参数,它们是“=”(powershell 假定这是一个字符串)和 $item(空对象)。然后将返回的任何内容分配给 $ArrayModify。

输出“T”的原因是因为您正在输出当前字符串的第一个元素。 $item 为字符串数组时输出“Test”。

【讨论】:

  • 问题是为什么他在循环一次的情况下得到字符串数组,而在循环两次的情况下得到数组的数组。我相信这只是正常的令人讨厌的奇怪的 powershell 阵列展开。
猜你喜欢
  • 1970-01-01
  • 2014-10-12
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 2022-01-22
  • 2013-05-18
相关资源
最近更新 更多