方法调用失败,因为[Sitecore.Data.Items.Item]不包含名为“ op_Addition”的方法

时间:2019-02-08 07:34:31

标签: powershell sitecore

我有一个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;
        }
    }
}

谢谢

1 个答案:

答案 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 = @()