none
SharePoint 2016 import export list

    Вопрос

  • День добрый.

    Подскажите как правильно написать сркипт powershell который позволил бы экспортировать список в cmp файл. а из него импортировать в уже существующий нульцевый настраеваемый список? с сохранением данных, кто когда изменял, добавлял данные в список.

    делал вот так: 
    Export-SPWeb https://portal.domen.ru/orgchart/ –ItemUrl “Lists/list1” –Path \\SP02\Backup_Sharepoint_List\export.cmp

    import-spweb -identity https://portal.domen.ru/orgchart/ –ItemUrl “Lists/Students" -path \\SPB-SRV-SP02\Backup_Sharepoint_List\export.cmp

    но таким образом  импортирует, но  заменяет данные кто изменял и создавал файл, на ту учетку из под которой был выполнен powershel командлет.

    подскажите как импортировать с сохранением данных, кто когда изменял, добавлял данные в список?





    • Изменено Dedman2k3 26 марта 2019 г. 11:12
    26 марта 2019 г. 11:11

Ответы

  • Могу предложить вариант копирования данных через консольное приложение Visual studio (C#), с сохранением Created, Created by, Modified, Modified by, если вам не принципиально делать эту операцию через PowerShell:

    using (SPSite oSPsite = new SPSite("https://portal.domen.ru/orgchart"))
                {
                    using (SPWeb oSPWeb = oSPsite.OpenWeb())
                    {
                        //List source
                        SPList srcList = oSPWeb.Lists["list1"];
                        //List destination
                        SPList destList = oSPWeb.Lists["Students"];
                        foreach (SPListItem sourceItem in srcList.Items)
                        {
                            SPListItem targetItem = destList.AddItem();
                            for (int i = sourceItem.Versions.Count - 1; i >= 0; i--)
                            {
                                SPListItemVersion sourceField = sourceItem.Versions[i];
                                targetItem["Author"] = sourceField["Author"];
                                targetItem["Title"] = sourceField["Title"];
                                targetItem["Editor"] = sourceField["Editor"];
                                targetItem[SPBuiltInFieldId.Modified] = GetFieldValueAsDate(sourceField["Modified"]);
                                targetItem[SPBuiltInFieldId.Created] = GetFieldValueAsDate(sourceField["Created"]);
                                targetItem.Update();
                            }
                        }
                    }
      private static String GetFieldValueAsDate(object sourceField)
            {
                string result = string.Empty;
                if (sourceField != null)
                {
                    DateTime date = Convert.ToDateTime(sourceField);
                    if (date.Year > 1900)
                        result = SPUtility.CreateISO8601DateTimeFromSystemDateTime(date);
                }
                return result;
            }
        }
    }
    28 марта 2019 г. 11:48
  • Данный код будет работать только на текущем сервере, для копирования данных с разных SP серверов и к тому же разных версий используйте ShareGate. Возможно кто-то предложит другое решение, изначально ваш вопрос как стоял?, копирование элементов списка с сохранением метаданных, ни слова о разных серверах и тем более версий SP.

    • Помечено в качестве ответа Dedman2k3 2 апреля 2019 г. 10:42
    • Изменено Mikhail Zhuikov 2 апреля 2019 г. 10:51
    2 апреля 2019 г. 9:24

Все ответы

  • Могу предложить вариант копирования данных через консольное приложение Visual studio (C#), с сохранением Created, Created by, Modified, Modified by, если вам не принципиально делать эту операцию через PowerShell:

    using (SPSite oSPsite = new SPSite("https://portal.domen.ru/orgchart"))
                {
                    using (SPWeb oSPWeb = oSPsite.OpenWeb())
                    {
                        //List source
                        SPList srcList = oSPWeb.Lists["list1"];
                        //List destination
                        SPList destList = oSPWeb.Lists["Students"];
                        foreach (SPListItem sourceItem in srcList.Items)
                        {
                            SPListItem targetItem = destList.AddItem();
                            for (int i = sourceItem.Versions.Count - 1; i >= 0; i--)
                            {
                                SPListItemVersion sourceField = sourceItem.Versions[i];
                                targetItem["Author"] = sourceField["Author"];
                                targetItem["Title"] = sourceField["Title"];
                                targetItem["Editor"] = sourceField["Editor"];
                                targetItem[SPBuiltInFieldId.Modified] = GetFieldValueAsDate(sourceField["Modified"]);
                                targetItem[SPBuiltInFieldId.Created] = GetFieldValueAsDate(sourceField["Created"]);
                                targetItem.Update();
                            }
                        }
                    }
      private static String GetFieldValueAsDate(object sourceField)
            {
                string result = string.Empty;
                if (sourceField != null)
                {
                    DateTime date = Convert.ToDateTime(sourceField);
                    if (date.Year > 1900)
                        result = SPUtility.CreateISO8601DateTimeFromSystemDateTime(date);
                }
                return result;
            }
        }
    }
    28 марта 2019 г. 11:48
  • Могу предложить вариант копирования данных через консольное приложение Visual studio (C#), с сохранением Created, Created by, Modified, Modified by, если вам не принципиально делать эту операцию через PowerShell:

    using (SPSite oSPsite = new SPSite("https://portal.domen.ru/orgchart"))
                {
                    using (SPWeb oSPWeb = oSPsite.OpenWeb())
                    {
                        //List source
                        SPList srcList = oSPWeb.Lists["list1"];
                        //List destination
                        SPList destList = oSPWeb.Lists["Students"];
                        foreach (SPListItem sourceItem in srcList.Items)
                        {
                            SPListItem targetItem = destList.AddItem();
                            for (int i = sourceItem.Versions.Count - 1; i >= 0; i--)
                            {
                                SPListItemVersion sourceField = sourceItem.Versions[i];
                                targetItem["Author"] = sourceField["Author"];
                                targetItem["Title"] = sourceField["Title"];
                                targetItem["Modified By"] = sourceField["Modified By"];
                                targetItem[SPBuiltInFieldId.Modified] = GetFieldValueAsDate(sourceField["Modified"]);
                                targetItem[SPBuiltInFieldId.Created] = GetFieldValueAsDate(sourceField["Created"]);
                                targetItem.Update();
                            }
                        }
                    }
      private static String GetFieldValueAsDate(object sourceField)
            {
                string result = string.Empty;
                if (sourceField != null)
                {
                    DateTime date = Convert.ToDateTime(sourceField);
                    if (date.Year > 1900)
                        result = SPUtility.CreateISO8601DateTimeFromSystemDateTime(date);
                }
                return result;
            }
        }
    }

    Супер спасибо за код, без разницы, можно и не через powershell, подскажите пожалуйста где его нужно, выполнить???

    правильно ли я понял, что его нужно выполнить в Visual Studio 2017.

    по этой статье??


    https://docs.microsoft.com/ru-ru/cpp/build/vscpp-step-1-create?view=vs-2017

    1 апреля 2019 г. 10:29
  • Да, подойдет, выберите Консольное приложение (C#), данный код нужно выполнять на текущем SharePoint server'e, не забудьте добавить Namespace:

    using System;
    
    using Microsoft.SharePoint;
    
    using Microsoft.SharePoint.Utilities;
    1 апреля 2019 г. 10:32
  • Да, подойдет, выберите Консольное приложение (C#), данный код нужно выполнять на текущем SharePoint server'e, не забудьте добавить Namespace:

    using System;
    
    using Microsoft.SharePoint;
    
    using Microsoft.SharePoint.Utilities;
    а не ставить на сервер SharePoint нельзя?  я сейчас инсталю на виртуалку win 10 И хотелось бы от туда запускать.
    1 апреля 2019 г. 11:39
  • Да, подойдет, выберите Консольное приложение (C#), данный код нужно выполнять на текущем SharePoint server'e, не забудьте добавить Namespace:

    using System;
    
    using Microsoft.SharePoint;
    
    using Microsoft.SharePoint.Utilities;

    а не ставить на сервер SharePoint нельзя?  я сейчас инсталю на виртуалку win 10 И хотелось бы от туда запускать.
    Только в пустую время тратите.
    1 апреля 2019 г. 11:49
  • Да, подойдет, выберите Консольное приложение (C#), данный код нужно выполнять на текущем SharePoint server'e, не забудьте добавить Namespace:

    using System;
    
    using Microsoft.SharePoint;
    
    using Microsoft.SharePoint.Utilities;

    а не ставить на сервер SharePoint нельзя?  я сейчас инсталю на виртуалку win 10 И хотелось бы от туда запускать.

    Только в пустую время тратите.

     ok, буду сейчас ставить на один из серверов фронтенда.

    Вопрос по поводу - "Namespace" не совсем понял

    Это нужно просто указать в начале кода? вот так?

    using System;

    using Microsoft.SharePoint;

    using Microsoft.SharePoint.Utilities;

    using (SPSite oSPsite = new SPSite("https://portal.domen.ru/orgchart"))
                {
                    using (SPWeb oSPWeb = oSPsite.OpenWeb())
                    {
                        //List source
                        SPList srcList = oSPWeb.Lists["list1"];
                        //List destination
                        SPList destList = oSPWeb.Lists["Students"];
                        foreach (SPListItem sourceItem in srcList.Items)
                        {
                            SPListItem targetItem = destList.AddItem();
                            for (int i = sourceItem.Versions.Count - 1; i >= 0; i--)
                            {
                                SPListItemVersion sourceField = sourceItem.Versions[i];
                                targetItem["Author"] = sourceField["Author"];
                                targetItem["Title"] = sourceField["Title"];
                                targetItem["Modified By"] = sourceField["Modified By"];
                                targetItem[SPBuiltInFieldId.Modified] = GetFieldValueAsDate(sourceField["Modified"]);
                                targetItem[SPBuiltInFieldId.Created] = GetFieldValueAsDate(sourceField["Created"]);
                                targetItem.Update();
                            }
                        }
                    }
      private static String GetFieldValueAsDate(object sourceField)
            {
                string result = string.Empty;
                if (sourceField != null)
                {
                    DateTime date = Convert.ToDateTime(sourceField);
                    if (date.Year > 1900)
                        result = SPUtility.CreateISO8601DateTimeFromSystemDateTime(date);
                }
                return result;
            }
        }
    }


    1 апреля 2019 г. 11:59
  • Пробуйте.
    1 апреля 2019 г. 12:03
  • Пробуйте.

    using System;

    using Microsoft.SharePoint;

    using Microsoft.SharePoint.Utilities;

    using (SPSite oSPsite = new SPSite("https://portal.domen.ru/orgchart"))
                {
                    using (SPWeb oSPWeb = oSPsite.OpenWeb())
                    {
                        //List source
                        SPList srcList = oSPWeb.Lists["list1"];
                        //List destination
                        SPList destList = oSPWeb.Lists["Students"];
                        foreach (SPListItem sourceItem in srcList.Items)
                        {
                            SPListItem targetItem = destList.AddItem();
                            for (int i = sourceItem.Versions.Count - 1; i >= 0; i--)
                            {
                                SPListItemVersion sourceField = sourceItem.Versions[i];
                                targetItem["Author"] = sourceField["Author"];
                                targetItem["Title"] = sourceField["Title"];
                                targetItem["Modified By"] = sourceField["Modified By"];
                                targetItem[SPBuiltInFieldId.Modified] = GetFieldValueAsDate(sourceField["Modified"]);
                                targetItem[SPBuiltInFieldId.Created] = GetFieldValueAsDate(sourceField["Created"]);
                                targetItem.Update();
                            }
                        }
                    }
      private static String GetFieldValueAsDate(object sourceField)
            {
                string result = string.Empty;
                if (sourceField != null)
                {
                    DateTime date = Convert.ToDateTime(sourceField);
                    if (date.Year > 1900)
                        result = SPUtility.CreateISO8601DateTimeFromSystemDateTime(date);
                }
                return result;
            }
        }
    }

    Попробовал, выдал куча ошибок...


    1 апреля 2019 г. 13:30
  • Я же вам выше писал нужно Консольное приложение C#:

    Нет никаких ошибок, полный код:

    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Utilities;
    using System;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (SPSite oSPsite = new SPSite("https://portal.domen.ru/orgchart"))
                {
                    using (SPWeb oSPWeb = oSPsite.OpenWeb())
                    {
                        //List source
                        SPList srcList = oSPWeb.Lists["list1"];
                        //List destination
                        SPList destList = oSPWeb.Lists["Students"];
                        foreach (SPListItem sourceItem in srcList.Items)
                        {
                            SPListItem targetItem = destList.AddItem();
                            for (int i = sourceItem.Versions.Count - 1; i >= 0; i--)
                            {
                                SPListItemVersion sourceField = sourceItem.Versions[i];
                                targetItem["Author"] = sourceField["Author"];
                                targetItem["Title"] = sourceField["Title"];
                                targetItem["Editor"] = sourceField["Editor"];
                                targetItem[SPBuiltInFieldId.Modified] = GetFieldValueAsDate(sourceField["Modified"]);
                                targetItem[SPBuiltInFieldId.Created] = GetFieldValueAsDate(sourceField["Created"]);
                                targetItem.Update();
                            }
                        }
                    }
                }
            }
                  private static String GetFieldValueAsDate(object sourceField)
            {
                string result = string.Empty;
                if (sourceField != null)
                {
                    DateTime date = Convert.ToDateTime(sourceField);
                    if (date.Year > 1900)
                        result = SPUtility.CreateISO8601DateTimeFromSystemDateTime(date);
                }
                return result;
            }
        }
    }
            
    1 апреля 2019 г. 13:48
  • Я же вам выше писал нужно Консольное приложение C#:

    я так и запускал:

    Все равно ошибки...

    или я не то консольное приложение  создаю? 

    1 апреля 2019 г. 13:56
  • Я же вам выше писал нужно Консольное приложение C#:

    я так и запускал:

    Все равно ошибки...

    или я не то консольное приложение  создаю? 

    Вы запускаете C++, а не C#...
    1 апреля 2019 г. 14:02
  • Вроде стало выполняться, но все равно есть ошибка не могу понять как ее исправить, подскажите плз!

    1 апреля 2019 г. 17:03
  • В свойствах проекта снимите галочку выполнять для 32-bit:


    1 апреля 2019 г. 17:51
  • С ошибками разобрался, решил.

    но есть теперь другая проблема.

    Когда создаю настраиваемый список "spisok1"  добавляю туда данные,  создаю тут же другой настраиваемый список  "spisok2", после выполняю код, отрабатывает без ошибок. норм.

    У меня задача старый список шарика 2007, который уже находиться на ферме SP2016, выглядит он так:

    импортировать в новый список SP2016.

    Собственно выполняю код пишет ошибку что такого  списка не существует=((

    в итоге:

    если копировать со списка SP2016 на другой список Sp2016 все работает, а если копировать со списка SP2007 на SP2016, то  старого списка он почему то не находит=(((

    2 апреля 2019 г. 7:44
  • Данный код будет работать только на текущем сервере, для копирования данных с разных SP серверов и к тому же разных версий используйте ShareGate. Возможно кто-то предложит другое решение, изначально ваш вопрос как стоял?, копирование элементов списка с сохранением метаданных, ни слова о разных серверах и тем более версий SP.

    • Помечено в качестве ответа Dedman2k3 2 апреля 2019 г. 10:42
    • Изменено Mikhail Zhuikov 2 апреля 2019 г. 10:51
    2 апреля 2019 г. 9:24
  • понял спс!
    2 апреля 2019 г. 10:42