foreach循环上的PowerShell + =正在添加重复的实例

时间:2014-01-27 21:08:23

标签: arrays powershell

我正在对由CSV填充的数组使用foreach循环。 CSV包含产品名称行,当前支持状态以及启动支持时的版本号。有时这些支持版本以逗号分隔,原因有很多。

如果在一行中找到以逗号分隔的版本,则会从该数组中删除该行。然后创建一个新行并将其添加到每个找到的版本的数组中。

我遇到的问题是如果我有一个版本的“7,8,9”我最终会有三行所有列出版本9.对脚本进行故障排除表明这些值正在拆分并正确拾取,但是数组似乎正在用最新的数据更新每个值。例如,第一次传递将使版本7,第二次传递有两个v8实例,最后一次传递最终以v9为3次。

如何让+ =运算符不更新现有行?     

    foreach ($line in $sheet)
    {
    if ($line.'Support Started' -cmatch ",") 
        {
        $sheet = $sheet -ne $line
        $line.'Support Started'.Split(",") |
               ForEach 
                {
                $subver = $_
                $line.'Support Started' = $subver
                $sheet = $sheet += ($line)
                }
         }
    }
    

如果我使用以下内容,请提供更多信息:

    write-host $line
    $sheet += $line
    write-host $line

在7,8,9作为版本的文件上,我得到以下输出:

产品1,支持,7个
产品1,支持,7
产品1,支持,8
产品1,支持,8
产品1,支持,9
产品1,支持,9

检查$ sheet的值时,我得到:

产品1,支持,9个
产品1,支持,9
产品1,支持,9

4 个答案:

答案 0 :(得分:1)

您确定没有使用Import-Csv读取文件吗?

你遇到问题的原因是你做的时候

foreach ($line in $sheet)
...

然后变量$ line不是$ sheet中行的副本,而是对sheet变量中行的引用。即当你更改$ line时,你实际上正在改变$ sheet。

我会尝试在操作数据时不更改$ sheet,而是创建一个可以容纳所有数据的新数组。像这样:

$sheet = Import-Csv data.csv

$newsheet = @()
foreach ($line in $sheet)
{
    if ($line.'Support Started' -cmatch ",") 
    {
        $a = $line.'Support Started'.Split(",")
        ForEach ($subver in $a)
        {
            $line2 = $line.PSObject.Copy()
            $line2.'Support Started' = $subver
            $newsheet += $line2
        }
    } else {
        $newsheet += $line
    }
}

答案 1 :(得分:0)

你的行

$sheet = $sheet += ($line)

应该阅读(编辑)

$sheet += @{'product'=$line.product; 'status'=$line.status; 'support started'=$_}
当$ line来自$ sheet时,PS会稍微混淆,通过制作新对象来补救

答案 2 :(得分:0)

$sheet = $sheet += ($line)

$sheet += $line已将$line追加到$sheet。额外的分配操作可能会导致您的问题。

答案 3 :(得分:0)

未经测试:

$sheet = 
foreach ($line in $sheet)
 {
   if ($line.'Support Started' -cmatch ",") 
    {
      $line.'Support Started'.Split(",") |
           ForEach 
            {
            $subver = $_
            $line.'Support Started' = $subver
            $line
            }
     }
  else {$line}
}