PowerShell中的Foreach循环不按顺序排列

时间:2016-09-12 20:57:18

标签: powershell foreach

我正在使用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
}

2 个答案:

答案 0 :(得分:4)

我认为您对Get-IniContent的来电是this script from the Microsoft Script Center

它返回[hashtable],并且在PowerShell [hashtable]中没有订购。

您可以尝试在Get-IniContent功能中更改此行:

$ini = @{}

对此:

$ini = [ordered]@{}

这可能会使物品保持有序。

答案 1 :(得分:4)

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

$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,允许您将哈希表和数组转换为有序词典。