具有两个值的Foreach循环和哈希表:

时间:2016-02-29 21:36:42

标签: foreach hashtable powershell-v4.0

示例01 - 下面是我在更复杂的脚本中使用的代码的简化示例。此代码有效。

问题在于我希望能够控制通过foreach循环处理两组值(网站名称和URL)的顺序。

我理解哈希表不会按照它们列出的顺序处理数据,而是以看似随机的方式列出来。

我做了什么: 我已经通过书籍,谷歌和堆栈交换对此进行了一些研究。

我尝试过使用GetEnumerator命令及其关联的“排序名称”选项,如下面的示例02所示。此示例适用于此上下文 - 它根据站点名称的字母顺序成功列出站点。但是我不想按字母顺序列出,而是按照规定的顺序列出。如果需要手动完成订购 很好,但我不知道如何实现这一目标。此外,当我尝试将此方法与我的实际脚本一起使用时,脚本将运行,但在此部分中它将显示“System.Collections.DictionaryEntry”,而不是正确运行脚本。也许我在这里没有正确运行它。

我做过什么: 我还尝试使用两个值的哈希表 - 站点名称和字母表中的字母。这成功地按照我用字母表中的字母规定的顺序列出了网站,但是我的实际脚本需要有两个值 - 网站名称和URL - 用于管理 运行脚本。

我也尝试在哈希表中使用三个值 - 我以为我可能已经看到这是可能的 - 但是如果这是可能的话我找不到使这个工作的语法。

最后的想法: 我想知道你是否可以使用两个哈希表来解决这个问题 - 一个用于设置foreach循环处理值的顺序(如下面的例03所示),另一个用于提供在foreach循环中使用的实际值(根据例子01)。

这是一种可能的解决方案还是替代方案? 有没有其他方法以合理的方式实现这一目标?

提前致谢。

示例01

 $Sites = @{
  'DuckDuckGo'    =    'https://duckduckgo.com'
  'Google'        =    'https://www.google.com'
  'Ixquick'       =    'https://www.ixquick.com'
  'Yahoo  '       =    'https://search.yahoo.com'
  'Dogpile'       =    'http://www.dogpile.com'
  'Yippee '       =    'http://www.yippy.com'
}
clear
write-host "`n`n`n"

foreach ($name in $Sites.Keys)  {
  write-host 
  "`t`t {0} `t`t`t {1}" -f $name , $Sites[$name] 
  write-host 
}

示例02

$Sites = @{
  'DuckDuckGo'    =    'https://duckduckgo.com'
  'Google'        =    'https://www.google.com'
  'Ixquick'       =    'https://www.ixquick.com'
  'Yahoo  '       =    'https://search.yahoo.com'
  'Dogpile'       =    'http://www.dogpile.com'
  'Yippee '       =    'http://www.yippy.com'
}

clear
write-host "`n`n`n"

foreach($name in $Sites.GetEnumerator() | Sort Name)
    {
        $name 
    }

write-host "`n`n`n`n"

示例03

$Sites = @{                                                                                             
  'DuckDuckGo'    =    'a'
  'Google'        =    'f'
  'Ixquick'       =    'c'
  'Yahoo  '       =    'z'
  'Dogpile'       =    'e'
  'Yippee '       =    'b'                                                                                                                                                                                                     
} 

$Sites.GetEnumerator() | Sort Value 

1 个答案:

答案 0 :(得分:1)

你觉得太复杂了。只需对哈希表的键进行排序,如下所示:

$Sites.Keys | Sort-Object | ForEach-Object {
  "{0}`t{1}" -f $_, $Sites[$_]
}

或者像这样:

foreach ($name in ($Sites.Keys | Sort-Object)) {
  "{0}`t{1}" -f $name, $Sites[$name]
}

如果您希望散列表的元素从一开始就按特定顺序创建一个有序的散列表:

$Sites = [ordered]@{
  'DuckDuckGo' = 'https://duckduckgo.com'
  'Google'     = 'https://www.google.com'
  'Ixquick'    = 'https://www.ixquick.com'
  'Yahoo  '    = 'https://search.yahoo.com'
  'Dogpile'    = 'http://www.dogpile.com'
  'Yippee '    = 'http://www.yippy.com'
}

作为旁注:不要混用Write-Host和PowerShell默认输出(裸字符串的回显)。他们做不同的事情。后者写入success output stream,而前者写入主机控制台。显示主机和流输出的顺序可能与您期望的顺序不同。