none
Перенос элементов в папку RRS feed

  • Вопрос

  • Добрый день! Всем хорошей пятницы)

    Есть список, решил переместить элементы(у них есть версии) в папки. Перемещаю через Параметры сайта  -> контент и структура. При перемещении админом, версии элемента и автор элемента меняется на админа...я что то не так делаю?


    9 октября 2015 г. 10:22

Ответы

  • Добрый день

    к сожалению не нашел ссылку на пост, скрипт писал не я, но я его немного допилил.

    что делает скрип,

    1. проверяет дату создания и получает год

    2. проверяет, есть ли в списке папка с требуемым годом и если нет, то создает.

    3. перемещает элемент в папку.

    4. обновляет поля кем и когда изменено.


    # Get Site
    #$Site = Get-SPSite -Identity "http://site";
    
    ## Get Web
    $Web = get-spweb http://site
    ## Initialize Counts
    
    $CountAll = 0;
    $ErrorCount = 0;
    
    function MoveItems()
    {
    $Count = 0;
    
    ## Get List
    $List = $Web.Lists["Заявки"];
    
    ## Set Query
    $Query = New-Object Microsoft.SharePoint.SPQuery;
    $Query.Folder = $List.RootFolder;
    $camlQuery = "<Where><Lt><FieldRef Name='Created' /><Value IncludeTimeValue='TRUE' Type='DateTime'>2014-12-31T18:34:39Z</Value></Lt></Where>";
    $Query.Query = $camlQuery;
    $Query.RowLimit = 100;
    
    
    #$List.GetItems($Query) |select Title, ID, Created | Format-Table -Autosize
    
    # Get all list items that match the query and where the item content type is not a folder
    $List.GetItems($Query)  | Where {$_.ContentType.Name -ne "Folder"}  |  foreach-object {
                                                                                        
          # Get the data we need to work with and update
          $ItemID = $_["ID"];
          $ItemTitle = $_["Title"];
          $Year = ([System.DateTime] $_["Created"]).Year;
          $ModifiedDate = [System.DateTime] $_["Modified"];
          $ModifiedBy = New-Object Microsoft.SharePoint.SPFieldUserValue($Web, [string]$_["Modified By"]);
    
          $ListPath = $Web.ServerRelativeUrl + "/" + $List.RootFolder.Url + "/";
          $FolderPath = $ListPath + $Year;
          $Folder = $Web.GetFolder($FolderPath);
    
          # Create the Year folder if it does not already exist
          if (-not $Folder.Exists)
              {
            $Folder = $List.Folders.Add("", [Microsoft.SharePoint.SPFileSystemObjectType]::Folder);
            $Folder["Title"] = $Year
            $Folder.Update();
        
          }
      
          Write-Host ("Moving: " + $ItemTitle);
    
          # Try moving the file to the subfolder setting the modified and modified date fields
          Try
          {
              $Web.GetFile($_.Url).MoveTo([System.String]::format("{0}/{1}", $Folder, $ItemID.ToString()+"_.000"));
              $Count = $Count + 1;
        
              $ListItem = $List.GetItemByID($ItemID);
              $ListItem["Editor"] = $ModifiedBy;
              $ListItem["Modified"] = $ModifiedDate;
              $ListItem.Update();
          }
          Catch [system.exception]
          {
              $ErrorCount = $ErrorCount + 1;
              Write-Error ("Error moving file: " + $ItemTitle);
          }
    
        }
        $Web.Dispose()
        Check $Count $CountAll $ErrorCount 
    }
    
    function Check($count, $countAll, $errorCount)
    {
        if ($count -eq 0)
        {
            Write-Host ("`n" + $count.ToString() + " items moved.");
    
            if ($errorCount -gt 0)
            {
                Write-Host ("`n" + $errorCount.ToString() + " errors.");
            }
        }
        else
        {
            $countAll = $countAll + $count
            MoveItems
    
        }
    }
    
    MoveItems
    


    мой блог Немного о SharePoint

    • Помечено в качестве ответа Kadackiy Dmitriy 15 октября 2015 г. 16:43
    9 октября 2015 г. 11:04
    Модератор

Все ответы

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

    так как вся структура переносится(пересоздается) администратором, то естественно он будет автором всех документов. Для переноса с сохранением прав и пользователей надо использовать сторонние решения.

    9 октября 2015 г. 10:32
  • примеры на c# есть? может утилы или workflow....плз ссылку...очень нид

    9 октября 2015 г. 10:36
  • Добрый день

    к сожалению не нашел ссылку на пост, скрипт писал не я, но я его немного допилил.

    что делает скрип,

    1. проверяет дату создания и получает год

    2. проверяет, есть ли в списке папка с требуемым годом и если нет, то создает.

    3. перемещает элемент в папку.

    4. обновляет поля кем и когда изменено.


    # Get Site
    #$Site = Get-SPSite -Identity "http://site";
    
    ## Get Web
    $Web = get-spweb http://site
    ## Initialize Counts
    
    $CountAll = 0;
    $ErrorCount = 0;
    
    function MoveItems()
    {
    $Count = 0;
    
    ## Get List
    $List = $Web.Lists["Заявки"];
    
    ## Set Query
    $Query = New-Object Microsoft.SharePoint.SPQuery;
    $Query.Folder = $List.RootFolder;
    $camlQuery = "<Where><Lt><FieldRef Name='Created' /><Value IncludeTimeValue='TRUE' Type='DateTime'>2014-12-31T18:34:39Z</Value></Lt></Where>";
    $Query.Query = $camlQuery;
    $Query.RowLimit = 100;
    
    
    #$List.GetItems($Query) |select Title, ID, Created | Format-Table -Autosize
    
    # Get all list items that match the query and where the item content type is not a folder
    $List.GetItems($Query)  | Where {$_.ContentType.Name -ne "Folder"}  |  foreach-object {
                                                                                        
          # Get the data we need to work with and update
          $ItemID = $_["ID"];
          $ItemTitle = $_["Title"];
          $Year = ([System.DateTime] $_["Created"]).Year;
          $ModifiedDate = [System.DateTime] $_["Modified"];
          $ModifiedBy = New-Object Microsoft.SharePoint.SPFieldUserValue($Web, [string]$_["Modified By"]);
    
          $ListPath = $Web.ServerRelativeUrl + "/" + $List.RootFolder.Url + "/";
          $FolderPath = $ListPath + $Year;
          $Folder = $Web.GetFolder($FolderPath);
    
          # Create the Year folder if it does not already exist
          if (-not $Folder.Exists)
              {
            $Folder = $List.Folders.Add("", [Microsoft.SharePoint.SPFileSystemObjectType]::Folder);
            $Folder["Title"] = $Year
            $Folder.Update();
        
          }
      
          Write-Host ("Moving: " + $ItemTitle);
    
          # Try moving the file to the subfolder setting the modified and modified date fields
          Try
          {
              $Web.GetFile($_.Url).MoveTo([System.String]::format("{0}/{1}", $Folder, $ItemID.ToString()+"_.000"));
              $Count = $Count + 1;
        
              $ListItem = $List.GetItemByID($ItemID);
              $ListItem["Editor"] = $ModifiedBy;
              $ListItem["Modified"] = $ModifiedDate;
              $ListItem.Update();
          }
          Catch [system.exception]
          {
              $ErrorCount = $ErrorCount + 1;
              Write-Error ("Error moving file: " + $ItemTitle);
          }
    
        }
        $Web.Dispose()
        Check $Count $CountAll $ErrorCount 
    }
    
    function Check($count, $countAll, $errorCount)
    {
        if ($count -eq 0)
        {
            Write-Host ("`n" + $count.ToString() + " items moved.");
    
            if ($errorCount -gt 0)
            {
                Write-Host ("`n" + $errorCount.ToString() + " errors.");
            }
        }
        else
        {
            $countAll = $countAll + $count
            MoveItems
    
        }
    }
    
    MoveItems
    


    мой блог Немного о SharePoint

    • Помечено в качестве ответа Kadackiy Dmitriy 15 октября 2015 г. 16:43
    9 октября 2015 г. 11:04
    Модератор
  • Дмитрий, здравствуйте!

    Вы ведь судя по тому, что речь идёт о папках, под списком подразумеваете библиотеку документов?.. В таком случае никакие сторонние решения совершенно ни к чему, т.к. есть очень простой и доступный способ: использовать WebDAV!

    Открываете в проводнике расположение интересующих файлов (для этого на используемом клиенте должна быть запущенной служба ОС "Веб-клиент", она же "WebClient", которая доступна через фичу "Desktop Experience"), вырезаете нужные файлы (Ctrl + X), переходите к новому расположению и вставляете их (Shift + Insert)!

    Тогда все версии и метаданные файлов (в т.ч. даты и авторы создания/изменения) полностью сохранятся в оригинальном виде! Сам уже неоднократно пользовался этой возможностью.

    13 октября 2015 г. 9:15
  • Через WebDAV можно сделать, но не у всех срабатывает.

    13 октября 2015 г. 10:51
  • Дмитрий, здравствуйте!

    Вы ведь судя по тому, что речь идёт о папках, под списком подразумеваете библиотеку документов?.. В таком случае никакие сторонние решения совершенно ни к чему, т.к. есть очень простой и доступный способ: использовать WebDAV!

    Открываете в проводнике расположение интересующих файлов (для этого на используемом клиенте должна быть запущенной служба ОС "Веб-клиент", она же "WebClient", которая доступна через фичу "Desktop Experience"), вырезаете нужные файлы (Ctrl + X), переходите к новому расположению и вставляете их (Shift + Insert)!

    Тогда все версии и метаданные файлов (в т.ч. даты и авторы создания/изменения) полностью сохранятся в оригинальном виде! Сам уже неоднократно пользовался этой возможностью.

    Под списком я подразумеваю список(обычный настраиваемый список), а не библиотеку :)

    Я хочу перенести элементы в папку без изменения автора. Делаю я это для того чтобы повысить производительность списка...прийти к тому чтобы у меня пороговой представление списка было к 5000 

    Скрипт, который предоставил Владимир я позже рассмотрю))




    15 октября 2015 г. 10:49
  • Владимир)) большое спасибо за скрипт)) в принципе то что я хотел)) 

    Всем спасибо за помощь)

    15 октября 2015 г. 16:45
  •  using (SPSite osite = new SPSite("http://site"))
                {
                    using (SPWeb oweb = osite.OpenWeb())
                    {
                        SPList list = oweb.Lists.TryGetList("test");
                        SPQuery query = new SPQuery();
                        query.Query = @"<Where>
                        <Eq>
                            <FieldRef Name='FSObjType' />
                            <Value Type='int'>0</Value>
                        </Eq>
                         </Where>";
    
                        SPListItemCollection items = list.GetItems(query);
                        foreach (SPListItem item in items)
                        {
                            Console.WriteLine(item.ID);
    
                            int ItemID = Convert.ToInt32(item["ID"]);
                            string ItemTitle = item["Title"].ToString();
                            int Year = Convert.ToDateTime(item["Created"]).Year;
                            DateTime ModifiedDate = Convert.ToDateTime(item["Modified"]);
                            string ModifiedBy = item["Author"].ToString();
    
                            string ListPath = oweb.ServerRelativeUrl + "/" + list.RootFolder.Url + "/";
                            string FolderPath = ListPath + Year;
                            SPFolder Folder = oweb.GetFolder(FolderPath);
    
                            if (!Folder.Exists)
                            {
                                SPListItem folderColl = list.Items.Add(list.RootFolder.ServerRelativeUrl, SPFileSystemObjectType.Folder, Year.ToString());
                        folderColl.Update();
                        list.Update();
    
                            }
    
                            oweb.GetFile(item.Url).MoveTo(string.Format("{0}/{1}", Folder.ServerRelativeUrl, ItemID.ToString()));
    
                            SPListItem itemz = list.GetItemById(ItemID);
                            itemz["Editor"] = ModifiedBy;
                            itemz["Modified"] = ModifiedDate;
                            itemz.UpdateOverwriteVersion();
                        }
                    }
                }

    Владимир по вашему коду...примерную рабочую схемку накидал на с#

    Кому нужно будет доработают))и с оптимизируют)) 


    16 октября 2015 г. 15:55