Skip to main content
 首页 » 编程设计

powershell之PowerShell 中的 Foreach 循环不按顺序

2024年12月31日12jirigala

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

配置文件

[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 
} 

请您参考如下方法:

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

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