PowerShell中的Foreach循环不正常
我正在使用PowerShell的配置文件,每次调用foreach循环来获取数据时,它都会以错误的顺序获取数据。见下文: config.iniPowerShell中的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
[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
),只是为了测试。查询将不会在我的finalconfig.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!