Introduction đ
Ă ce stade, je pense que tous les dĂ©veloppeurs Sitecore utilisent ou ont au moins entendu parler de Extensions PowerShell de Sitecore (SPE). Ce module puissant pour Sitecore est automatiquement inclus pour la plupart des Ă©quipes et des projets. Le module est inclus avec les instances XM Cloud par dĂ©faut; si vous utilisez XM Cloud, vous disposez dĂ©jĂ de SPE. Si, dâune maniĂšre ou dâune autre, vous nâavez pas entendu parler de SPE, arrĂȘtez tout ce que vous faites et allez le vĂ©rifier. đȘđââïž
SPE comprend plusieurs modules prĂȘts Ă lâemploi (OOTB) rapports que les utilisateurs peuvent exĂ©cuter. Sur un projet rĂ©cent, lâun de ces rapports est arrivĂ© : le ĂlĂ©ments multimĂ©dias inutilisĂ©s rapport qui se trouve dans lâarborescence de contenu de Sitecore au chemin suivant :
/sitecore/system/Modules/PowerShell/Script Library/SPE/Reporting/Content Reports/Reports/Media Audit/Unused media items
Ce rapport gĂ©nĂšre une liste dâĂ©lĂ©ments multimĂ©dias qui se trouvent dans la mĂ©diathĂšque mais qui ne sont pas utilisĂ©s dans Sitecore, oĂč « utilisĂ© » est dĂ©fini comme Ă©tant rĂ©fĂ©rencĂ© au moins une fois dans la base de donnĂ©es de liens Sitecore. En dâautres termes, le rapport rĂ©pertorie les Ă©lĂ©ments multimĂ©dias qui sont (probablement) prenant juste de la place.
Extension du rapport đ
Dans mon cas, plutĂŽt que de gĂ©nĂ©rer un rapport sur les Ă©lĂ©ments multimĂ©dias inutilisĂ©s, je devais faire le contraire : gĂ©nĂ©rer un rapport sur les Ă©lĂ©ments multimĂ©dias inutilisĂ©s. utilisĂ© Ă©lĂ©ments multimĂ©dias et exportez ces Ă©lĂ©ments Ă lâaide de packages de contenu (qui seront installĂ©s dans des environnements supĂ©rieurs dans le cadre dâune migration de contenu). Utiliser lâOOTB ĂlĂ©ments multimĂ©dias inutilisĂ©s rapport comme point de dĂ©part, jâai Ă©crit un script plus gĂ©nĂ©rique et Ă usage gĂ©nĂ©ral pour regrouper les Ă©lĂ©ments multimĂ©dias en fonction de plusieurs critĂšres. Lorsque le script est exĂ©cutĂ©, cela ressemble Ă ceci (jâai utilisĂ© PowerShell ISE inclus avec SPE pour exĂ©cuter le script) :
âŠsuite ci-dessous đ (âŠJâai besoin dâun moniteur plus grand đ„)
ParamĂštres â
Voici un aperçu des différents paramÚtres :
- Médias à inclure
- Défaut: Utilisé
- Ce paramĂštre dĂ©termine si les processus de script ont utilisĂ© des Ă©lĂ©ments multimĂ©dias, des Ă©lĂ©ments multimĂ©dias inutilisĂ©s ou Ă la fois des Ă©lĂ©ments multimĂ©dias utilisĂ©s et inutilisĂ©s. Pour dĂ©terminer si un Ă©lĂ©ment est utilisĂ© ou non, le script interroge la base de donnĂ©es de liens pour obtenir le nombre de rĂ©fĂ©rents pour lâĂ©lĂ©ment.
- Dossiers de la bibliothÚque multimédia
- Défaut: (aucun)
- Utilisez ce paramĂštre pour dĂ©signer les dossiers Ă partir desquels vous souhaitez que le script extraie et traite les Ă©lĂ©ments multimĂ©dias. Le script inclut une vĂ©rification pour empĂȘcher le traitement des Ă©lĂ©ments multimĂ©dias en double si, pour une raison quelconque, plusieurs dossiers multimĂ©dias qui se chevauchent sont sĂ©lectionnĂ©s.
- Notez que le nĆud de la bibliothĂšque multimĂ©dia racine peut ĂȘtre sĂ©lectionnĂ©, mais cela nâest pas idĂ©al pour des raisons de performances. Il est prĂ©fĂ©rable de limiter le script aux dossiers multimĂ©dias dont vous savez quâils contiennent les Ă©lĂ©ments multimĂ©dias que vous devez exporter. Si aucun dossier nâest sĂ©lectionnĂ©, le script ne fait rien.
- Extensions Ă inclure
- Défaut: (aucun)
- Si vous souhaitez que le script traite uniquement les Ă©lĂ©ments multimĂ©dias avec certaines extensions, vĂ©rifiez les extensions correspondantes ici. Notez que, par dĂ©faut, aucune extension nâest cochĂ©e et aucun filtrage dâextension nâest appliquĂ©. Vous souhaitez uniquement exporter des PDF ? VĂ©rifier la
pdf
extension. Vous voulez tous les éléments multimédias, quelle que soit leur extension ? Ne cochez aucune extension.
- Date limite
- Défaut: (aucun)
- Sâil est spĂ©cifiĂ©, ce paramĂštre oblige le script Ă traiter uniquement les Ă©lĂ©ments multimĂ©dias qui ont Ă©tĂ© créés ou mis Ă jour. aprĂšs cette date.
- Ce paramĂštre est utile si vous devez exĂ©cuter une exportation « delta » pour rĂ©cupĂ©rer des Ă©lĂ©ments nouveaux ou mis Ă jour depuis une exĂ©cution prĂ©cĂ©dente. Nâoubliez pas la date de votre derniĂšre course. Notez que les noms de fichiers des packages gĂ©nĂ©rĂ©s incluent un horodatage, par exemple : 20240323T0504075151Z â Exporter les Ă©lĂ©ments multimĂ©dias 1.zip.
- Taille maximale du paquet
- Défaut: 25 Mo
- Le script utilise le
Size
champ sur les Ă©lĂ©ments multimĂ©dias pour estimer la taille globale des fichiers dans un package de contenu donnĂ©. Si la taille totale des Ă©lĂ©ments multimĂ©dias empaquetĂ©s atteint ce seuil, un package supplĂ©mentaire est créé jusquâĂ ce que tous les Ă©lĂ©ments multimĂ©dias soient empaquetĂ©s. - Le script peut gĂ©nĂ©rer des packages qui sont plus grand que cette taille â la vĂ©rification du seuil a lieu aprĂšs un fichier a Ă©tĂ© ajoutĂ©. Notez Ă©galement que la taille sur le disque dâun Ă©lĂ©ment sĂ©rialisĂ© nâest pas exactement la mĂȘme que le nombre dâoctets stockĂ©s dans le fichier.
Size
champ. En dâautres termes, la logique du « package chunking » est approximative. - De maniĂšre anecdotique, jâai remarquĂ© que lorsque les packages de contenu deviennent volumineux (x > 200 Mo), leur tĂ©lĂ©chargement et leur installation peuvent devenir risquĂ©s, en fonction de lâenvironnement. Choisissez une taille adaptĂ©e Ă votre cas dâutilisation.
- Exclure les dossiers systĂšme
- Par dĂ©faut : CochĂ© (â)
- Si cette case est cochée, le script ignorera tous les éléments multimédias dont le chemin contient
/System/
. Ceci est utile pour exclure, par exemple, les miniatures générées par Sitecore.
- Sortie détaillée de la console
- Par dĂ©faut : CochĂ© (â)
- Si cette case est cochĂ©e, une sortie supplĂ©mentaire est Ă©crite sur la console, ce qui peut ĂȘtre utile lors dâun essai Ă sec avec le mode dĂ©bogage (ci-dessous).
- Mode débogage
- Par dĂ©faut : CochĂ© (â)
- Si cette case est cochĂ©e, le script nâĂ©crira aucun package de contenu sur le disque. Ceci est utile lors de lâexĂ©cution dâexĂ©cutions Ă sec du script pour gĂ©nĂ©rer le rapport dĂ©taillant quel Ă©lĂ©ment se trouve dans quel package avant de sâengager Ă Ă©crire un nombre potentiellement important de fichiers ou des fichiers individuels volumineux sur le disque.
- En supposant que cette case à cocher est décochéles packages de contenu résultants sont enregistrés sur le disque sous le
$SitecorePackageFolder
chemin, qui est généralementC:\inetpub\wwwroot\App_Data\packages
. - Si vous ne voyez aucun package de contenu sur le disque, assurez-vous que ce paramÚtre est décoché.
Sortie đ
Le script fournit essentiellement trois formes diffĂ©rentes de sortie : la sortie de la console, la boĂźte de dialogue typique des rĂ©sultats du rapport SPE (avec fonctionnalitĂ© dâexportation CSV et Excel) et les packages de contenu eux-mĂȘmes qui sont Ă©crits sur le disque. Par exemple, en supposant que la sortie de la console dĂ©taillĂ©e soit cochĂ©e et que la taille maximale du package soit de 100 Mo, la sortie de la console pourrait ressembler Ă ceci :
La ligne cyan affiche le nombre total dâĂ©lĂ©ments multimĂ©dias Ă traiter en fonction des paramĂštres. Les lignes vertes dĂ©taillent le premier package Ă crĂ©er, les lignes magenta rĂ©pertoriant chaque Ă©lĂ©ment multimĂ©dia de ce premier package. Les lignes vertes et magenta se rĂ©pĂštent jusquâĂ ce que tous les Ă©lĂ©ments multimĂ©dias soient traitĂ©s et que tous les packages de contenu soient gĂ©nĂ©rĂ©s. Le dernier morceau de sortie de la console ressemblera Ă ceci :
Les lignes grises reprĂ©sentent les chemins sur le disque pour chacun des packages de contenu gĂ©nĂ©rĂ©s. Notez que les packages gĂ©nĂ©rĂ©s sont nommĂ©s Ă lâaide dâun modĂšle qui inclut un horodatage ; il sâagit de lâheure (du serveur) Ă laquelle le script a Ă©tĂ© exĂ©cutĂ© et sera la mĂȘme date et heure pour tous les packages gĂ©nĂ©rĂ©s lors dâune exĂ©cution particuliĂšre.
La boßte de dialogue des résultats du rapport est similaire aux autres rapports SPE et pourrait ressembler à ceci :
Ă partir de lĂ , lâutilisateur peut voir quels Ă©lĂ©ments multimĂ©dias se trouvent dans quels packages. En exportant ces donnĂ©es vers un fichier CSV ou Excel, les utilisateurs peuvent auditer les packages de contenu installĂ©s, configurer une automatisation supplĂ©mentaire en aval, utiliser le fichier comme manifeste pour lâarchivage des Ă©lĂ©ments multimĂ©dias, etc.
IdĂ©es dâamĂ©liorations đĄ
Il y a toujours place Ă lâamĂ©lioration. Voici quelques-unes de mes idĂ©es :
- Ajouter la prise en charge des Ă©lĂ©ments non multimĂ©dias serait sympa, mĂȘme si cela signifierait devoir comprendre comment calculer la taille des packages. sans lâutilisation du
Size
champ (qui est unique aux Ă©lĂ©ments multimĂ©dias et est automatiquement dĂ©fini par Sitecore lors du tĂ©lĂ©chargement dâun fichier). Je suppose que vous pourriez dĂ©terminer la taille dâun article sĂ©rialisĂ© en mĂ©moire et lâutiliserâŠđ€ - Y compris plus dâextensions : autres extensions dâimage, extensions vidĂ©o, extensions Office, etc.
- Autoriser une plage de dates pour traiter les fichiers ajoutés ou modifiés dans un laps de temps donné.
- Exposer plus dâoptions pour lâinstallation du package plutĂŽt que de supposer un Ă©crasement.
- Prise en charge dâune convention de dĂ©nomination configurable pour les packages gĂ©nĂ©rĂ©s.
- Ajustements généraux des performances.
Avez-vous dâautres idĂ©es dâamĂ©liorations ? Voyez-vous un bug ou une faute de frappe que jâai manqué ? Sâil vous plaĂźt laissez-moi un commentaire ci-dessous! đŹ đ
Le Code đ»
Le script est disponible en tant que GitHub Gist public ici et est Ă©galement dupliquĂ© ci-dessous si vous ne comprenez pas lâessentiel (blague de papa ?).
<# .SYNOPSIS Creates content packages for media items matching certain criteria. By default, packages are saved to disk at C:\inetpub\wwwroot\App_Data\packages. .NOTES Original "Unused media items" report (/sitecore/system/Modules/PowerShell/Script Library/SPE/Reporting/Content Reports/Reports/Media Audit/Unused media items) written by Michael West. Additional parameters, filtering, content package creation, etc. written by Nick Sturdivant. This script requires that Sitecore PowerShell Extensions be installed. #> $reportName = "Export Media Items" $extensionOptions = [ordered]@{ "bmp" = "bmp"; "gif" = "gif"; "jpg" = "jpg"; "jpeg" = "jpeg"; "pdf" = "pdf"; "png" = "png"; "svg" = "svg"; } $maxPackageSizeOptions = [ordered]@{ "5 MB" = 5000000; "10 MB" = 10000000; "25 MB" = 25000000; "50 MB" = 50000000; "100 MB" = 100000000; "250 MB" = 250000000 } $usedMediaItemOptions = [ordered]@{ "Both" = "both"; "Used" = "used"; "Unused" = "unused" } $props = @{ Parameters = @( @{ Name = "usedMediaMode" Title = "Media to Include" Tooltip = "Determines if the script processes used, unused, or both used and unused media items (where ""used"" is defined as having at least one entry in the link database)." Value = "used" Options = $usedMediaItemOptions } @{ Name = "selectedMediaFolders" Title = "Media Library Folders" Tooltip = "The media library folders from which to include items." Value = @() Editor = "treelist" } @{ Name = "selectedExtensions" Title = "Extensions to Include" Tooltip = "The file extension(s) for the media items to process and include in the package(s)." Value = @() Options = $extensionOptions Editor = "check" } @{ Name = "cutoffDate" Title = "Cutoff Date" Tooltip = "If set, causes the script to only process media items that were created or updated after this date." Value = [datetime]::MinValue Editor = "date" } @{ Name = "selectedMaxPackageSize" Title = "Maximum Package Size" Tooltip = "The maximum size package the script will generate. If the total size of the media items to be packaged exceeds this limit, then multiple packages are created until all items have been packaged." Value = 25000000 Options = $maxPackageSizeOptions } @{ Name = "excludeSystemFolders" Title = "Exclude System Folders" Tooltip = "If checked, any media items with ""/System/"" anywhere in their path are ignored." Value = $true Editor = "check" } @{ Name = "verboseOutput" Title = "Verbose Console Output" Tooltip = "If checked, additional output will be written to the console." Value = $true Editor = "check" } @{ Name = "debugMode" Title = "Debug Mode" Tooltip = "If checked, no packages will be saved to disk." Value = $true Editor = "check" } ) Title = " $reportName" Icon = "OfficeWhite/32x32/box_into.png" Description = "This script queries for used and/or unused (referenced) media items and generates content packages containing those items." Width = 600 ShowHints = $true } $result = Read-Variable @props $items = @() $itemsReport = @() $timestamp = (Get-Date -Format FileDateTimeUniversal) if ($result -eq "cancel") { exit } function HasReference { param( $Item ) $linkDb = [Sitecore.Globals]::LinkDatabase $linkDb.GetReferrerCount($Item) -gt 0 } function Get-MediaItemWithReference { param( [string]$Path, [string[]]$Extensions ) $mediaItemContainer = Get-Item ("master:" + $Path) $excludedTemplates = @([Sitecore.TemplateIDs]::MediaFolder, [Sitecore.TemplateIDs]::Node) $items = $mediaItemContainer.Axes.GetDescendants() | Where-Object { $excludedTemplates -notcontains $_.TemplateID } | Initialize-Item | Where-Object { -not $excludeSystemFolders -or ( -not ($_.FullPath -like "*/System/*") ) } | Where-Object { $cutoffDate -eq [datetime]::MinValue -or ( $_.__Created -gt $cutoffDate -or $_.__Updated -gt $cutoffDate ) } | Where-Object { $Extensions.Count -eq 0 -or $Extensions -contains $_.Fields["Extension"].Value } # filter based on usage (links) foreach ($item in $items) { if ($usedMediaMode -eq "both") { $item } if ($usedMediaMode -eq "used" -and (HasReference -Item $item)) { $item } if ($usedMediaMode -eq "unused" -and (-not (HasReference -Item $item))) { $item } } } function Build-Package { param( [Sitecore.Data.Items.Item[]]$Items, [int]$Size, [int]$PackageNumber, [ref]$ItemsReport ) if ($verboseOutput) { Write-Host "" Write-Host "Building package $PackageNumber..." -ForegroundColor Green Write-Host "Total items: $($Items.Count)" -ForegroundColor Green Write-Host "Total size: $Size bytes" -ForegroundColor Green Write-Host "" } $package = New-Package -Name "Export Media Items" $package.Sources.Clear() $package.Metadata.Author = "SPE" $package.Metadata.Version = $timestamp $package.Metadata.Readme = "A package containing media items; generated by a Sitecore PowerShell Extensions script." $packageZipFileName = "$( $package.Metadata.Version ) - $( $package.Name ) $PackageNumber.zip" foreach ($itemToPackage in $Items) { if ($verboseOutput) { Write-Host "`t+ $($itemToPackage.FullPath)` ($($itemToPackage.Fields["Size"].Value -as [int]) bytes)" -ForegroundColor Magenta } $source = Get-Item $itemToPackage.FullPath | New-ExplicitItemSource -Name "$($itemToPackage.ID)" -InstallMode Overwrite $package.Sources.Add($source) $ItemsReport.Value += @{ ID = $itemToPackage.ID FullPath = $itemToPackage.FullPath Package = $packageZipFileName } } if (-not $debugMode) { Export-Package -Project $package -Path $packageZipFileName -Zip } } foreach ($selectedMediaFolder in $selectedMediaFolders) { # ensure selected media folder is the media library itself or a folder within the media library if ($selectedMediaFolder.FullPath -ne "/sitecore/media library" -and $selectedMediaFolder.TemplateID -ne [Sitecore.TemplateIDs]::MediaFolder) { Write-Host "Selected folder $($selectedMediaFolder.FullPath) is neither the media library root nor a media folder within the media library and will be ignored." -ForegroundColor Yellow continue } $itemsFromPath = Get-MediaItemWithReference -Path $selectedMediaFolder.FullPath -Extensions $selectedExtensions # prevent duplicate items if overlapping media folders are selected foreach ($itemFromPath in $itemsFromPath) { $existingItem = $items | Where-Object { $_.ID -eq $itemFromPath.ID } if ($null -eq $existingItem) { $items += $itemFromPath } } } if ($items.Count -eq 0) { Show-Alert "There are no media items matching the specified parameters." } else { Write-Host "Total media items to be processed and packaged: $($items.Count)" -ForegroundColor Cyan $packageSize = 0 $itemsInPackage = @() $itemsProcessed = 0 $packageCount = 0 foreach ($itemToPackage in $items) { $itemsInPackage += $itemToPackage $packageSize += $itemToPackage.Fields["Size"].Value -as [int] $itemsProcessed++ if ($packageSize -ge $selectedMaxPackageSize -or $itemsProcessed -eq $items.Count) { $packageCount++ Build-Package -Items $itemsInPackage -Size $packageSize -PackageNumber $packageCount -ItemsReport ([ref]$itemsReport) $packageSize = 0 $itemsInPackage = @() } } # report output $mediaToInclude = "" if ($usedMediaMode -eq "both") { $mediaToInclude = "Both (used and unused)" } else { $mediaToInclude = ($usedMediaMode.Substring(0, 1).ToUpper() + $usedMediaMode.Substring(1)) } $mediaFolders = "" $selectedMediaFolders | ForEach-Object { $mediaFolders += "<br/> - $($_.FullPath)" } $extensions = $selectedExtensions -join ", " if ($extensions -eq "") { $extensions = "(all)" } $infoDescription = "List of the media items matching the specified criteria that are contained within the generated content packages.<br/><br/>" + "Media to Include: $mediaToInclude<br/>" + "Media Library Folders: $mediaFolders<br/>" + "Extensions to Include: $extensions<br/>" + "Cutoff Date: " if ($cutoffDate -eq [datetime]::MinValue) { $infoDescription += "(none)<br/>" } else { $infoDescription += "$($cutoffDate.ToShortDateString())<br/>" } $infoDescription += "Maximum Package Size: $($selectedMaxPackageSize / 1000000) MB<br/>" + "Exclude System Folders: $excludeSystemFolders<br/>" + "Verbose: $verboseOutput<br/>" + "Debug: $debugMode" $reportProps = @{ InfoTitle = $reportName InfoDescription = $infoDescription PageSize = 25 Title = $reportName } Write-Host "" Write-Host "Finished! đ" -ForegroundColor Cyan if ($verboseOutput) { Write-Host "" $itemsReport | ForEach-Object { $_.Package } | Select-Object -Unique | ForEach-Object { Write-Host ($SitecorePackageFolder + "\" + $_) -ForegroundColor Gray } } # display report output $itemsReport | Show-ListView @reportProps -Property @{ Label = "ID"; Expression = { $_.ID } }, @{Label = "Full Path"; Expression = { $_.FullPath } }, @{Label = "Package"; Expression = { $_.Package } } }
(đ Remarque : lâextrait de code ci-dessus Peut-ĂȘtre pas ĂȘtre tenu Ă jour avec lâessentiel au fil du temps)
Source link