Лучший отвечающий
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; } } }
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 2 апреля 2019 г. 7:21
- Изменено Mikhail Zhuikov 2 апреля 2019 г. 9:31
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; } } }
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 2 апреля 2019 г. 7:21
- Изменено Mikhail Zhuikov 2 апреля 2019 г. 9:31
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-20171 апреля 2019 г. 10:29 -
Да, подойдет, выберите Консольное приложение (C#), данный код нужно выполнять на текущем SharePoint server'e, не забудьте добавить Namespace:
using System; using Microsoft.SharePoint; using Microsoft.SharePoint.Utilities;
- Изменено Mikhail Zhuikov 1 апреля 2019 г. 10:36
1 апреля 2019 г. 10:32 -
Да, подойдет, выберите Консольное приложение (C#), данный код нужно выполнять на текущем SharePoint server'e, не забудьте добавить Namespace:
using System; using Microsoft.SharePoint; using Microsoft.SharePoint.Utilities;
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; } } }
- Изменено Mikhail Zhuikov 1 апреля 2019 г. 14:12
1 апреля 2019 г. 13:48 -
Я же вам выше писал нужно Консольное приложение C#:
я так и запускал:
Все равно ошибки...
или я не то консольное приложение создаю?
1 апреля 2019 г. 13:56 -
Я же вам выше писал нужно Консольное приложение C#:
я так и запускал:
Все равно ошибки...
или я не то консольное приложение создаю?
1 апреля 2019 г. 14:02 -
Вроде стало выполняться, но все равно есть ошибка не могу понять как ее исправить, подскажите плз!
1 апреля 2019 г. 17:03 -
В свойствах проекта снимите галочку выполнять для 32-bit:
- Изменено Mikhail Zhuikov 2 апреля 2019 г. 9:22
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