Powershell 为什么foreach循环变量显示1集,而应该有更多

Powershell 为什么foreach循环变量显示1集,而应该有更多,powershell,variables,foreach,Powershell,Variables,Foreach,我导入了一个CSV文件,并将导入的信息缩减为包含两行数据($updateAnchorage),当我调用$updateAnchorage时,它包含我期望的数据。然后,我使用foreach循环从导入的数据创建了2个哈希表,如下所示。我试图更好地理解PowerShell,所以我的问题是,为什么foreach循环中的$row只提供一行数据,而我希望它显示两行 以下是代码和结果: $updateA = Import-Csv -Path C:\Windows\System32\MyFile-CSV.csv

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

以下是代码和结果:

$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 命名旧的新的
--------
城市-惠普激光喷射4250N-销售。。。192.168.2.120 192.168.2.50
城市-利盟XM1145-销售公司。。。192.168.2.106 192.168.2.51

PS C:\Users\a>$row

命名旧的新的
--------
城市-利盟XM1145-销售公司。。。192.168.2.106 192.168.2.51


$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
}
完成后,运行与
$Row
等价的
$Num
将是“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(in){}
,则只能在foreach的大括号内引用
。它在外面对你来说毫无用处。

我发布了一个具体问题的答案,为什么
$row
只有一个值,但你能用脚本阐明你的最终目标吗?当导入的CSV已经是一个类型为
[System.Management.Automation.PSCustomObject]
的对象时,将CSV拆分为两个哈希表是没有意义的,该类型的对象可以使用,并且比哈希表更强大。谢谢您的说明,这对我来说真的很清楚。这非常有意义,并且肯定会对我将来使用foreach循环有所帮助。为了回答您的问题,我有一列“旧”IP,它们不再适用于我们的使用,我们希望将它们从打印机IP中删除,并用“新”IP替换它们。然后基于“新”IP,我需要重新创建现有打印机并使用新的命名约定。因此,1个散列有旧的/新的键/值对,另一个有新的/名称键/值对。这是我能想到的最好的方法来跟踪它。你最好使用一个CSV,它类似于:
“OldName”、“NewName”、“OldIP”、“NewIP”
然后当你做
$CSV=Import CSV which.CSV
时,你可以为每个($CSV格式的打印机)做
并使用
$Printer.OldName
$Printer.NewIP
或其他任何。。。如果您查找pscustomobject,这就是PowerShell在导入CSV时创建的内容。我一直在寻找一些源代码,这些源代码不久前会准确地告诉我,但找不到我要查找的内容。我一定是措词不对。我一定会记住这一点,因为那会让我省去很多心痛。你真棒,谢谢你。