【问题标题】:Foreach Loop in PowerShell Not in OrderPowerShell中的Foreach循环不按顺序
【发布时间】:2017-01-20 09:14:21
【问题描述】:

我正在使用 PowerShell 的配置文件,每次我调用 foreach 循环来抓取数据时,它都会以错误的顺序抓取它。见下文:

config.ini

[queries]

query01=stuff1

query02=stuff2

query03=stuff3

query04=stuff4

foreach 循环:

#Loads an INI file data into a variable
$iniContent = Get-IniContent 'config.ini'
#grabs the hashtable for the data under the [queries] section
$queries = $iniContent['queries']

foreach($query in $queries.GetEnumerator())
{
    write-host $query.name
}

我得到以下输出:

stuff1
stuff4
stuff2
stuff3

我假设这与来自 PowerShell 的异步处理有关,但是按照我在其中存储它们的顺序处理来自 config.ini 文件的查询的最佳方法是什么?

注意:我将数字添加到查询的末尾 (query01) 仅用于测试目的。这些查询不会在我的最终config.ini 中包含它们。

编辑:

Get-IniContent函数:

function Get-IniContent ($filePath)
{
    $ini = @{}
    switch -regex -file $FilePath
    {
        “^\[(.+)\]” # Section
        {
            $section = $matches[1]
            $ini[$section] = @{}
            $CommentCount = 0
        }
        “(.+?)\s*=(.*)” # Key
        {
            $name,$value = $matches[1..2]
            $ini[$section][$name] = $value
        }
    }
    return $ini
}

【问题讨论】:

    标签: powershell foreach


    【解决方案1】:

    我假设您拨打Get-IniContent 的电话是this script from the Microsoft Script Center

    它返回一个 [hashtable] 并且在 PowerShell 中 [hashtable]s 没有排序。

    您可以尝试在Get-IniContent 函数中更改此行:

    $ini = @{}
    

    到这里:

    $ini = [ordered]@{}
    

    这可以让项目保持有序。

    【讨论】:

    • 我尝试使用[ordered] 或在我的情况下使用$ini = New-Object System.Collections.Specialized.OrderedDictionary,但顺序仍然混乱。我想你可能会在我的 Get-IniContent 函数中有所了解。
    【解决方案2】:

    您需要将两个哈希表声明都更改为有序字典。如果你只改变

    $ini = @{}
    

    $ini = [ordered]@{}
    

    您的 $ini 现在是一个有序字典,但嵌套哈希表创建于

    $ini[$section] = @{}
    

    仍然是一个无序的哈希表。您需要将它们都更改为有序字典。

    function Get-IniContent ($filePath)
    {
      $ini = [ordered]@{}
      switch -regex -file $FilePath
      {
        “^\[(.+)\]” # Section
        {
            $section = $matches[1]
            $ini[$section] = [ordered]@{}
            $CommentCount = 0
        }
        “(.+?)\s*=(.*)” # Key
        {
            $name,$value = $matches[1..2]
            $ini[$section][$name] = $value
        }
      }
      return $ini
    }
    

    编辑

    脚本中心还有一个ConvertTo-OrderedDictionary script,如果您不想重写函数,可以将哈希表和数组转换为有序字典。

    【讨论】:

    • 这太完美了。我的函数中缺少另一个 $ini[$section]。现在一切都很完美。
    • 很棒的@StephenP!
    猜你喜欢
    • 2016-08-10
    • 1970-01-01
    • 2020-08-14
    • 2019-09-19
    • 1970-01-01
    • 2013-01-04
    • 2020-03-11
    • 2020-05-27
    • 1970-01-01
    相关资源
    最近更新 更多