我正在使用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
}
答案 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,允许您将哈希表和数组转换为有序词典。