【问题标题】:PowerShell/GetEnumeratorPowerShell/GetEnumerator
【发布时间】:2010-06-04 08:43:57
【问题描述】:

我有一个简单的问题:

为什么下面的程序没有写入整个数组$lines?它永远循环。我真的很困惑..

function Get-Current ($enumerator) {
    $line = $enumerator.Current
    return $line
}

$lines = @('a', 'b', 'c')
$enumerator = $lines.GetEnumerator()
$enumerator.Reset()

while ($enumerator.MoveNext()) {
    $line = Get-Current $enumerator
    "$line"     
}

【问题讨论】:

    标签: .net powershell


    【解决方案1】:

    好像是这样的表达:

    $enumerator
    

    展开整个枚举器。例如:

    PS C:\> $lines = @('a', 'b', 'c')
    PS C:\> $enumerator = $lines.GetEnumerator()
    PS C:\> $enumerator.Reset()
    PS C:\> $enumerator
    a
    b
    c
    

    因此,当您尝试将表达式传递给函数时,它会被渲染为无效。我能想到的唯一解决方法是将其作为 PSObject 传递,如下所示:

    function Get-Current ($val) {
        $val.Value.Current
    }
    
    $lines = @('a', 'b', 'c')
    $enumerator = $lines.GetEnumerator()
    $enumerator.Reset()
    
    while ($enumerator.MoveNext()) {
        $line = Get-Current $(get-variable -name enumerator)
        $line
    }
    

    【讨论】:

    • 这正是我的意思!谢谢。
    • PowerShell 在许多情况下会自动解包数组和枚举数。这通常非常方便且节省时间,但有时它会导致问题,如您所见。
    【解决方案2】:

    不知道为什么 MoveNext 从不返回 false。这行得通

    $lines = @('a', 'b', 'c')
    $enumerator = $lines.GetEnumerator()
    
    while ($enumerator.MoveNext()) {
        $enumerator.Current
    }
    

    【讨论】:

    • 好的,我知道了。我永远不会使用这些语句来简单地迭代数组。 sn-p 只是一个说明。所以我的问题仍然是为什么函数调用“损坏”枚举器。
    • @Marek 尝试重命名参数,尝试包装 PsObject 但没有任何效果。相当棘手的行为:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 2021-08-25
    • 2014-01-09
    • 1970-01-01
    • 2020-05-13
    相关资源
    最近更新 更多