使用“选择”导出CSV文件时的Lazy-Pipe-Evaluation

时间:2016-07-12 16:04:09

标签: csv powershell select pipe lazy-evaluation

预期脚本输出:我想导出包含Microsoft SharePoint列表中某些列的CSV文件。

脚本-概要: 首先,我在$items中获取列表项:

$query = New-Object Microsoft.SharePoint.Client.CamlQuery
$items = $list.GetItems($query)

输出CSV文件的列在散列图$h$displayName => $internalName)中定义。

现在,我为每列创建一个新的 Hashtable ,并将其添加到$selects

$selects = @()
foreach ($h in $mapping.GetEnumerator()) {
     $selects += @{ L = $h.Name; E = { $_[$h.Value] } }
}

然后我exoprt CSV文件:

$items | Select-Object $selects | Export-Csv -Path $outputPath

现在出现问题:

在E中我定义了一个表达式,只有当我需要它时才会计算(懒惰,所以当执行Select时)。 发生这种情况时,对$h.Value属性的引用已被更改,因为$h正在循环播放。 因此,在计算表达式时,$h指向已循环的最后一个对象(因此是hashmap的最后一个元素)。在管道中评估的每个 select语句都是这种情况。

我可以通过在另一个变量中保存$h(或其值)的引用来解决此问题。 但后来我需要一个硬编码的变量。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

感谢PetSerAl,这里是经过测试的&工作代码示例:

foreach ($h in $mapping.GetEnumerator()) {
     $selects += @{ L = $h.Name; E = { $_[$h.Value] }.GetNewClosure() }
}

我们可以使用闭包来冻结循环内$h的引用,如in this article所述。