2016-09-12 120 views
2

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

回答

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

+0

這很完美。我在函數中忽略了其他'$ ini [$ section]'。一切現在完美。 – Webtron

+0

大抓@StephenP! – briantist

4

我假設你要Get-IniContent呼叫this script from the Microsoft Script Center

它返回[hashtable]並且在PowerShell [hashtable]中沒有排序。

你可以嘗試在Get-IniContent功能改變這一行:

$ini = @{} 

要這樣:

$ini = [ordered]@{} 

這可以允許保持在順序選擇項目。

+0

我試着使用''[ordered]'或者在我的例子中使用'$ ini = New-Object System.Collections.Specialized.OrderedDictionary',但是順序依然混亂。我想你可能會在我的'Get-IniContent'函數中進行一些操作。 – Webtron