预期脚本输出:我想导出包含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
(或其值)的引用来解决此问题。
但后来我需要一个硬编码的变量。
我该如何解决这个问题?
答案 0 :(得分:0)
感谢PetSerAl,这里是经过测试的&工作代码示例:
foreach ($h in $mapping.GetEnumerator()) {
$selects += @{ L = $h.Name; E = { $_[$h.Value] }.GetNewClosure() }
}
我们可以使用闭包来冻结循环内$h
的引用,如in this article所述。