Отчеты Sitecore Powershell не возвращают никаких результатов - PullRequest
0 голосов
/ 11 февраля 2019

Я создал отчет, если я запускаю его вручную из Powershell ISE, он генерирует список ожидаемых элементов, но когда я запускаю его из средств отчетности, он не возвращает результатов.

Сценарий очищает всеверсии и языки элементов, которые составляют около 80 000 элементов, и на это требуется время.

Есть ли способ добавить задержку, пока не будет создан список всех элементов, или любой другой обходной путь?

Исходный код:

$RichTextContentID = "";
$internalLinkPattern = '<a href="~\/link\.aspx\?_id=(?<sitecoreid>[a-zA-Z\d]{32})&amp;_z=z">';
$literatureTemplate = "";
$global:guiltyItems = @();

function Process-RichText
{
    param(  [Parameter(Mandatory = $true)] [Sitecore.Data.Fields.Field]$field,
            [Parameter(Mandatory = $true)] [string]$pattern,
            [Parameter(Mandatory = $true)] [Sitecore.Data.Items.Item]$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 $literatureTemplate)
        {   
            if ($global:guiltyItems -notcontains $item)
            {
                $global:guiltyItems += $item;
            }
        }
    }
}

$allitems = Get-Item master -Query "/sitecore/content/MyWebsiteTree//*" -Language * -Version *; 
foreach ($item in $allItems) {
    foreach ($field in $item.Fields)
    {
        if ($field.Id -eq $RichTextContentID -and ($field.Value -match $internalLinkPattern))
        {
           Process-RichText $field $internalLinkPattern $item;
        }
    }
}


if ($global:guiltyItems.Count -eq 0) {
        Show-Alert "Did not find any items to match your condition.";
    } 
else {
    $props = @{
        Title = ""
        InfoDescription = ""
        PageSize = 50
    };

    ($global:guiltyItems) |
        Show-ListView @props -Property @{ Label="Item name"; Expression={$_.Name}; },
            @{ Label="ID"; Expression={$_.ID}; },
            @{ Label="Display name"; Expression={$_.DisplayName}; },
            @{ Label="Language"; Expression={$_.Language}; },
            @{ Label="Version"; Expression={$_.Version}; },
            @{ Label="Path"; Expression={$_.ItemPath}; },
            @{ Label="Created"; Expression={$_.__Created}; },
            @{ Label="Created by"; Expression={$_."__Created by"}; },
            @{ Label="Updated"; Expression={$_.__Updated}; },
            @{ Label="Updated by"; Expression={$_."__Updated by"}; }
}

Close-Window;

Спасибо

LE: Заполнение объекта $ allitems занимает некоторое время, и клиент sitecore не ждет, пока бэкэнд прочитает все элементы, и поэтомукогда я генерирую отчет, $ global: guiltyItems всегда пуст.

1 Ответ

0 голосов
/ 13 февраля 2019

Я нашел решение: с помощью фильтров.И работает как надо.

$RichTextContentID = "";
$internalLinkPattern = '<a href="~\/link\.aspx\?_id=(?<sitecoreid>[a-zA-Z\d]{32})&amp;_z=z">';
$literatureTemplateID = "";

$root = Get-Item -Path "master:/sitecore/content/MyWebsite";

filter Where-HasLiterature{
    param([Parameter(Mandatory=$TRUE,ValueFromPipeline=$TRUE)][Sitecore.Data.Items.Item]$item)

    if($item)
    {
        foreach ($field in $item.Fields)
        {
            if ($field.Id -eq $RichTextContentID -and ($field.Value -match $internalLinkPattern))
            {
                $allMatches = [System.Text.RegularExpressions.Regex]::Matches($field.Value,$internalLinkPattern);

                foreach ($match in $allMatches)
                    {
                        $guiltyItem = Get-Item "master:" -Id ([Sitecore.Data.ID]::Parse($match.Groups["sitecoreid"].Value)).Guid;
                        $guiltyItemTemplate = [Sitecore.Data.Managers.TemplateManager]::GetTemplate($guiltyItem);

                        if ($guiltyItem -ne $null -and $guiltyItemTemplate.DescendsFromOrEquals($literatureTemplateID) )
                        {
                            $item;
                        }
                    }   

            }

        }
    }
}

$items = Get-ChildItem -Path $root.ProviderPath -Recurse | Where-HasLiterature

if ($items.Count -eq 0) 
{
    Show-Alert "Did not find any items to match your condition.";
} 
else 
{
    $props = @{
        Title = ""
        InfoDescription = ""
        PageSize = 50
    }

    $items | Show-ListView @props -Property @{ Label="Item name"; Expression={$_.Name}; },
            @{ Label="ID"; Expression={$_.ID}; },
            @{ Label="Display name"; Expression={$_.DisplayName}; },
            @{ Label="Language"; Expression={$_.Language}; },
            @{ Label="Version"; Expression={$_.Version}; },
            @{ Label="Path"; Expression={$_.ItemPath}; },
            @{ Label="Created"; Expression={$_.__Created}; },
            @{ Label="Created by"; Expression={$_."__Created by"}; },
            @{ Label="Updated"; Expression={$_.__Updated}; },
            @{ Label="Updated by"; Expression={$_."__Updated by"}; }
} 
...