我有一个powershell脚本,其中需要创建一个符合条件的项目的报告,但是我需要将这些项目存储在函数上下文之外的列表(guiltyItems)中,并且标题中的错误是返回。
方法调用失败,因为[Sitecore.Data.Items.Item]没有 包含一个名为“ op_Addition”的方法
它在这里失败:$global:guiltyItems += $_;
Sitecore Powershell中是否可以创建一个Sitecore项目列表并填充它?
如果有任何相关性,则从一个foreach循环调用Process-Richtext
函数,该循环位于另一个foreach循环内:
$global:guiltyItems = $null;
function Process-RichText
{
param( [Parameter(Mandatory = $true)] [Sitecore.Data.Fields.Field]$field,
[Parameter(Mandatory = $true)] [string]$pattern,
[Parameter(Mandatory = $true)] [Sitecore.Data.Items.Item]$_)
$allMatches = [System.Text.RegularExpressions.Regex]::Matches($field.Value,$pattern);
foreach ($match in $allMatches)
{
$currentItem = Get-Item master -Id ([Sitecore.Data.ID]::Parse($match.Groups["sitecoreid"].Value)).Guid;
if ($currentItem.Template.Id -eq $quiltyTemplate)
{
$global:guiltyItems += $_;
}
}
}
[...]
ForEach ($item in $allItems) {
foreach ($field in $item.Fields)
{
if ($field.Id -eq $RichTextContentID -and ($field.Value -match $internalLinkPattern))
{
Process-RichText $field $internalLinkPattern $item;
}
}
}
谢谢
答案 0 :(得分:1)
该问题是由动态键入引起的。该脚本首先将guiltyItems
设置为null,所以它没有类型。到目前为止没有什么奇怪的。在foreach循环中出现键入问题。
$global:guiltyItems = $null;
...
foreach ($match in $allMatches) {
...
if ($currentItem.Template.Id -eq $quiltyTemplate) {
$global:guiltyItems += $_; # Boom!
所以这里发生的是null变量没有类型。在foreach循环中,处理后的变量确实具有类型,因为它们不是null。第一次迭代会将guiltyItems
设置为迭代对象的任何类型。像错误消息声明一样,添加两个Sitecore.Data.Items.Item
是没有道理的。
将guiltyItems
声明为数组时,加法才有意义。它不是将两个Sitecore项加在一起,而是将新元素添加到集合中。
如果您的收藏集仅包含一个元素,则该脚本很可能不会出现问题。那是因为该加法仅被调用一次。
根据评论,要解决此问题,请像这样将数组明确声明为$global:guiltyItems
,
$global:guiltyItems = @()