Close Menu
    DevStackTipsDevStackTips
    • Home
    • News & Updates
      1. Tech & Work
      2. View All

      Error’d: Pickup Sticklers

      September 27, 2025

      From Prompt To Partner: Designing Your Custom AI Assistant

      September 27, 2025

      Microsoft unveils reimagined Marketplace for cloud solutions, AI apps, and more

      September 27, 2025

      Design Dialects: Breaking the Rules, Not the System

      September 27, 2025

      Building personal apps with open source and AI

      September 12, 2025

      What Can We Actually Do With corner-shape?

      September 12, 2025

      Craft, Clarity, and Care: The Story and Work of Mengchu Yao

      September 12, 2025

      Cailabs secures €57M to accelerate growth and industrial scale-up

      September 12, 2025
    • Development
      1. Algorithms & Data Structures
      2. Artificial Intelligence
      3. Back-End Development
      4. Databases
      5. Front-End Development
      6. Libraries & Frameworks
      7. Machine Learning
      8. Security
      9. Software Engineering
      10. Tools & IDEs
      11. Web Design
      12. Web Development
      13. Web Security
      14. Programming Languages
        • PHP
        • JavaScript
      Featured

      Using phpinfo() to Debug Common and Not-so-Common PHP Errors and Warnings

      September 28, 2025
      Recent

      Using phpinfo() to Debug Common and Not-so-Common PHP Errors and Warnings

      September 28, 2025

      Mastering PHP File Uploads: A Guide to php.ini Settings and Code Examples

      September 28, 2025

      The first browser with JavaScript landed 30 years ago

      September 27, 2025
    • Operating Systems
      1. Windows
      2. Linux
      3. macOS
      Featured
      Recent
    • Learning Resources
      • Books
      • Cheatsheets
      • Tutorials & Guides
    Home»Development»Sitecore PowerShell commands – XM Cloud Content Migration

    Sitecore PowerShell commands – XM Cloud Content Migration

    May 8, 2025

    In this post, I’ve listed the most commonly used Sitecore PowerShell commands for content migration. This blog continues from my earlier post: Sitecore XM Cloud Content Migration: Plan and Strategy.

    During migration, we created several PowerShell scripts to extract data from the legacy database to CSVs. We then used those CSVs to import content into XM Cloud instances. Based on those scripts, I organized the commands into two groups: Working with Sitecore items and Working with Sitecore renderings. These commands aim to help developers handle similar Sitecore to XM Cloud migrations.

    Working With Sitecore Items

    Create a New Item Using the Template ID

    $item = New-Item -Path $path -Name $itemName -ItemType $itemTemplateId -Language "en"

    Sometimes, you may need to create an item with the same ID as in the legacy system to avoid numerous reconfigurations. Especially if those items are being used as the data source. In such a use case, we could use CreateItem from Sitecore.Data.Managers.ItemManager. This method takes the item name, parent item, template ID, and item ID. The passed $id will be the ID of the newly created Sitecore Item. 

    $item = [Sitecore.Data.Managers.ItemManager]::CreateItem($name, $parentItem, $templateItem.ID, $id)

    Also, there is a ForceId param supported by the ‘New Item‘ function

    New-Item -Path $path -Name $name -ItemType "Blog Page" -ForceId "3904b0bf-b10b-4fbb-9ced-3de87dfa3d48"

    Create a New Item Using the Branch Template

    $item = [Sitecore.Data.Managers.ItemManager]::AddFromTemplate($itemName, $branchTemplateId, $parentItem)

    Checking if the Path Exists in the Content Tree

    In use cases, we need to check whether the path exists before creating an item on that path. 

    $pathExists = Test-Path -Path $path
    if($pathExists)
    {
      //logic
    }

    Copying Items

    Copy-Item -Path $sourcePath -Destination $targetPath

    Working with Sitecore Renderings

    Get All Renderings for an Item

    This script was used to analyze an item’s legacy renderings, map them with new XM cloud renderings (components), and map fields. 

    $item = Get-Item -Path $path -Version "latest"
    $resultObj = @()
    $defaultLayout = Get-LayoutDevice "Default"
    Get-Rendering -Item $item -Device $defaultLayout -FinalLayout | ForEach {
        $renderingItem = Get-Item -Path master: -ID $_.ItemID
        $Obj = @{
            RenderingName =  $renderingItem.Name
            RenderingId =  $_.ItemID
            DataSource = $_.Datasource
            Placeholder = $_.Placeholder
            PageItem = $_.OwnerItemID
    }
        $resultObj += New-Object psobject -Property $Obj
    }
    $resultObj | Format-Table RenderingName, RenderingId, DataSource, Placeholder, PageItem

    Create and Set Rendering for an Item

    When importing data from CSV, we often need to create and set a data source to render an item.  For this use case, I created a function that takes the rendering ID, the placeholder to add the rendering, and the data source ID. 

    function CreateAndSetRendering{
        param([String]$id,[String]$placeholder,[String]$dsid
            )
            
            $renderingId = [Sitecore.Data.ID]::Parse($id)
            $rendering = get-item -path master: -id $renderingId
            $renderinginstance = $rendering | new-rendering -placeholder $placeholder
            if($dsid -ne "")
            {
                $datasourceId = [Sitecore.Data.ID]::Parse($dsid)
                $renderinginstance.datasource = $datasourceId
            }
            add-rendering -item $item -placeholder $placeholder -instance $renderinginstance -finallayout
            $item.editing.beginedit()
            $item.editing.endedit() | out-null
    }

    Retrieve the Rendering and Remove From the Presentation

    {3904b0bf-b10b-4fbb-9ced-3de87dfa3d48} is the Sitecore Item ID of the rendering item we wish to retrieve

    $defaultLayout = Get-LayoutDevice "Default"
    $rendering = Get-Rendering -Item $item -Device $defaultLayout -FinalLayout | Where-Object { $_.ItemID -eq "{3904b0bf-b10b-4fbb-9ced-3de87dfa3d48}"}
    Remove-Rendering -Item $item -Instance $rendering -Device $defaultLayout -FinalLayout

    Getting a Specific Rendering Parameter Value

    $paraName is the rendering parameter name, for example, “Styles”.

    $rendering = Get-Item -Path master: -Id "{3904b0bf-b10b-4fbb-9ced-3de87dfa3d48}"
    $renderingItem = Get-Rendering -Item $item -Device $defaultLayout -Rendering $rendering -FinalLayout
    $parameterValue = Get-RenderingParameter -Rendering $renderingItem -Name $paramName

    Updating Rendering Parameter Value

    If there are more than one rendering of the same type, the returned $renderingItem will be an array so you can access the first rendering parameters $renderingItem[0].Parameters: This will return all parameters, and then you will have to check for a specific parameter.

    $rendering = Get-Item -Path master: -Id "{3904b0bf-b10b-4fbb-9ced-3de87dfa3d48}"
    $renderingItem = Get-Rendering -Item $item -Device $defaultLayout -Rendering $rendering -FinalLayout
    $renedringParams = $renderingItem[0].Parameters
    $styles = "Styles"
     if ($renedringParams.Contains($styles)) {
          $renedringParams = @{
                Styles = "%7B3904b0bf-b10b-4fbb-9ced-3de87dfa3d48%7D"
        }
        }
    Set-RenderingParameter -Instance $renderingItem[0] -Parameter $renedringParams | Out-Null
    Set-Rendering -Item $item -Instance $renderingItem[0] -FinalLayout

    Note: We must embed Sitecore ID for your required style between %7B and %7D. For multiple values, the separator is %7D%7C%7B. It’s how Sitecore stores params values.

    You can store multiple values like this: Styles = “%7B3904b0bf-b10b-4fbb-9ced-3de87dfa3d48%7D%7C%7B936219ee-a03b-49c5-8eff-8b877b5c1319%7D”

    Conclusion

    So, this is the consolidated list of Sitecore PowerShell commands for content migration. The IDs used in the above snippets were not valid Sitecore item IDs. Replace them with valid Sitecore item IDs based on the Sitecore items used in your project.

    Keep learning!

    Source: Read More 

    Facebook Twitter Reddit Email Copy Link
    Previous ArticleOur Partner Adobe Recognized Again as a DXP Leader
    Next Article Mastering Node.js Streams: The Ultimate Guide to Memory-Efficient File Processing

    Related Posts

    Development

    Using phpinfo() to Debug Common and Not-so-Common PHP Errors and Warnings

    September 28, 2025
    Development

    Mastering PHP File Uploads: A Guide to php.ini Settings and Code Examples

    September 28, 2025
    Leave A Reply Cancel Reply

    For security, use of Google's reCAPTCHA service is required which is subject to the Google Privacy Policy and Terms of Use.

    Continue Reading

    Why MongoDB is the Perfect Fit for a Unified Namespace

    Databases

    The Silent SaaS Advantage: How React Boosts Retention & Cuts Costs

    Web Development

    VS meldt actief misbruik van beveiligingslek in Commvault-webserver

    Security

    Madonna thinks her computer was hacked

    Development

    Highlights

    Development

    Fortinet SSL VPNs Hit by Global Brute-Force Wave Before Attackers Shift to FortiManager

    August 12, 2025

    Cybersecurity researchers are warning of a “significant spike” in brute-force traffic aimed at Fortinet SSL…

    RansomHub Went Dark April 1; Affiliates Fled to Qilin, DragonForce Claimed Control

    April 30, 2025

    DeepSeek-AI Released DeepSeek-Prover-V2: An Open-Source Large Language Model Designed for Formal Theorem, Proving through Subgoal Decomposition and Reinforcement Learning

    May 1, 2025

    Community News: Latest PEAR Releases (04.07.2025)

    April 7, 2025
    © DevStackTips 2025. All rights reserved.
    • Contact
    • Privacy Policy

    Type above and press Enter to search. Press Esc to cancel.