PowerShell中的Foreach循环不正常

PowerShell中的Foreach循环不正常,powershell,foreach,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

我正在使用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
),只是为了测试。查询将不会在我的final
config.ini
中包含它们

编辑:

获取内容
功能:

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
}
$ini = @{}

我想您对
获取IniContent
的呼叫是

它返回一个
[hashtable]
,并且在PowerShell中
[hashtable]
s未排序

您可以尝试在
Get ini content
函数中更改此行:

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
}
$ini = @{}
为此:

$ini = [ordered]@{}

这可能会使项目保持有序。

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

$ini = @{}

您的$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
}
编辑


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

我尝试使用
[ordered]
或者在我的例子中
$ini=New Object System.Collections.Specialized.OrderedDictionary
,但顺序仍然混乱。我想你可能在我的获取内容功能中找到了一些东西。这太完美了。我的函数中缺少另一个
$ini[$section]
。现在一切都很完美。很好的捕捉@StephenP!