为什么foreach循环变量在应该有更多时显示1组

时间:2017-04-18 20:20:55

标签: powershell variables foreach

我导入了一个CSV文件,并将导入的信息缩小为包含2行数据($updateAnchorage),当我调用$updateAnchorage时,它包含我期望的数据。然后我使用foreach循环从导入的数据创建了2个哈希表,我将在下面给出。我试图更好地理解PowerShell,所以我的问题是为什么foreach循环中的$row只提供一行数据,而我希望它显示2行?

以下是代码和结果:

$updateA = Import-Csv -Path C:\Windows\System32\MyFile-CSV.csv `
        -Header "name","old","new" | select -Skip 2
$hashIP = @{}
$hashName = @{}

foreach($row in $updateA)
{
    $hashIP[$row.old] = $row.new
    $hashName[$row.new] = $row.Name   
}

以下是$updateA$rows的输出:

  

PS C:\ Users \ a> $ updateA   旧名新   ---- --- ---
  城市 - HP LaserJet 4250N - 销售... 192.168.2.120 192.168.2.50
  城市 - 利盟XM1145 - 销售公司... 192.168.2.106 192.168.2.51

     

PS C:\ Users \ a> $行

     

姓旧新郎   ---- --- ---
  城市 - 利盟XM1145 - 销售公司... 192.168.2.106 192.168.2.51

1 个答案:

答案 0 :(得分:1)

$ Row将是通过foreach构造的最后一件事。您需要调用$ hashIP或$ hashName。

这是您的脚本创建的内容:

[nickj@nick-lt scripts]$ $hashIP

Name                           Value                                                                                                                                                                                                                 
----                           -----                                                                                                                                                                                                                 
2.2.2.2                        2.2.2.3                                                                                                                                                                                                               
1.1.1.1                        1.1.1.2                                                                                                                                                                                                               

[nickj@nick-lt scripts]$ $hashName

Name                           Value                                                                                                                                                                                                                 
----                           -----                                                                                                                                                                                                                 
2.2.2.3                        Name2                                                                                                                                                                                                                 
1.1.1.2                        Name1   

我的CSV:

"Name","Old","New"
Name1,1.1.1.1,1.1.1.2
Name2,2.2.2.2,2.2.2.3

如果你做了这样简单的事情:

$Array = 1,2,3,4,5

foreach ($Num in $Array)
{
    continue
}

运行$Num时,$Row等于'{1}}将是'5',因为它将是数组传递foreach结构的最后一件事。它基本上是这样做的:

$Array = 1,2,3,4,5

$Num = $Array[0]
# Continue

$Num = $Array[1]
# Continue

$Num = $Array[2]
# Continue

$Num = $Array[3]
# Continue

$Num = $Array[4]
# Continue

因此,通过每个循环,$ Num被设置为它正在处理的当前数组值。如果您将其描绘为foreach (<WHAT> in <COLLECTION>) {},则只应在foreach的括号内引用<WHAT>。它在外面变得无用。