Ошибка вызова метода, поскольку [Sitecore.Data.Items.Item] не содержит метод с именем «op_Addition» - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть сценарий powershell, в котором мне нужно создать отчет об элементах, соответствующих условию, но мне нужно хранить эти элементы в списке (guiltyItems) вне контекста моих функций, и ошибка из заголовка:возвращено.

Ошибка вызова метода, поскольку [Sitecore.Data.Items.Item] не содержит метод с именем 'op_Addition'

Здесь происходит сбой: $global:guiltyItems += $_;

Есть ли способ в Sitecower powershell создать список элементов Sitecore и заполнить его?

Если он имеет какое-либо отношение, вызов функции Process-Richtext выполняется из цикла foreach,который находится в другом цикле 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 голосов
/ 08 февраля 2019

Проблема вызвана динамической типизацией.Сценарий начинается с установки guiltyItems на ноль, поэтому он не имеет типа.Пока ничего странного.Проблема типизации возникает в цикле foreach.

$global:guiltyItems = $null;
...
foreach ($match in $allMatches) {
    ...
    if ($currentItem.Template.Id -eq $quiltyTemplate) {
        $global:guiltyItems += $_; # Boom!

Итак, здесь происходит то, что переменная null не имеет типа.В цикле foreach обработанные переменные имеют типы, так как они не являются нулевыми.Первая итерация установит guiltyItems для любого типа итерируемого объекта.Как и в сообщениях об ошибках, добавление двух Sitecore.Data.Items.Item не имеет смысла.

Когда guiltyItems объявлено как массив, добавление имеет смысл.Это не добавление двух элементов Sitecore вместе, а добавление новых элементов в коллекцию.

Если ваша коллекция содержит только один элемент, сценарий, скорее всего, будет работать без изменений.Это потому, что сложение вызывается только один раз.

В соответствии с комментарием, чтобы решить проблему, объявите $global:guiltyItems в явном виде в виде массива, подобного этому,

$global:guiltyItems = @()
...