我正在对一个由CSV填充的数组使用foreach循环。 CSV包含产品名称,当前支持状态以及支持开始时的版本号的行。有时出于各种原因,这些支持版本以逗号分隔。
当在一行中找到逗号分隔的版本时,该行将从数组中删除。然后创建一个新行,并将其添加到找到的每个版本的数组中。
我遇到的问题是,如果我的版本为“ 7,8,9”,我最终会列出所有列出版本9的三行。对该脚本进行故障排除表明,这些值已被正确拆分和拾取,但是数组似乎正在用最新的值更新每个值。例如,第一遍将创建版本7,第二遍具有两个v8实例,最后一遍以v9结束3次。
如何使+ =运算符不更新现有行?
foreach($ sheet中的$ line){if($ line.'Support Started'-cmatch“,”){$ sheet = $ sheet -ne $ line$ line.'Support Started'.Split(“,”)|每次{$ subver = $ _$ line.'Support Started'= $ subver$ sheet = $ sheet + =($ line)}}}
如果要使用以下内容,请提供更多信息:
写主机$ line$ sheet + = $ line写主机$ line
在版本为7,8,9的文件上,我得到以下输出:
产品1,支持,7产品1,支持,7产品1,支持,8产品1,支持,8产品1,支持,9产品1,支持,9
[检查$ sheet的值时,我得到:
产品1,支持,9产品1,支持,9产品1,支持,9
确定您没有使用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
}
}
$sheet = $sheet += ($line)
未测试:
您的电话
从文本文件读取时,我遇到了foreach与write-host复制输出的问题,该问题已归结为正被读取的文件中的行返回,这被视为foreach针对其输出写入主机的有效条目