none
Прошу помощи в реализации PowerShell скрипта RRS feed

  • Вопрос

  • Прошу помощи в реализации (как лучше реализовать).

    Использую SharePoint 2010, ilovesharepoint, powershell

    1) При создании элемента в списке, необходимо создавать папку в библиотеке документов (имя папки = имя элемента).

    Использую код в Power Item Event Receiver:

    function ItemAdded

    {

                    $NewFolderName = $item.Name

                    $ListDisplayName = "Документы"

                    $WebURL= "https://kr.ru/dsa/task"

                    $Site = New-Object Microsoft.sharepoint.spsite($WebURL)

                    $Web = $Site.OpenWeb()

                    # write-host $Web.URL

                    $List = $Web.Lists[$ListDisplayName]

                    $FolderName = $List.RootFolder

                    # write-host $FolderName.SubFolders

        $NewFolderItem = $List.Items.Add($ItemSubSub.ServerRelativeUrl,[Microsoft.SharePoint.SPFileSystemObjectType]::Folder,$NewFolderName)

                    $this.DisableEventFiring()

                    $NewFolderItem.SystemUpdate()

                    $List.Update()

                    $this.EnableEventFiring()

    }

    2) Проблема, если указать в имени элемента спецсимволы, то папка не создается. Как это обойти?

    При создании элемента необходима проверка имени элемента на наличие спецсимволов, которые не могут быть применимы для наименования папки в библиотеке документов. 

    Если есть спецсимволы в имени элемента, не создавать элемент, а выдать сообщение пользователю с ошибкой.

    Можно использовать:

    $message = "Внимание! Исключите из названия спецсимволы"

    $properties.Cancel = $true

    $properties.ErrorMessage = $message

    3) После создания папки в библиотеке, необходимо получить URL этой папки.

       И записать этот URL папки в определенный столбец списка.

    4) Убедиться, что любой  рабочий процесс, назначенный на изменение элемента, не запускается после выполнения п.3

    Возможно, есть более простые способы реализации?

    Подскажите ресурс или книгу, что бы более детально изучить PowerShell для SharePoint 2010 (желательно с примерами).

    14 марта 2012 г. 2:35

Ответы

  • Имя папки я бы проверил при помощи регулярного выражения(не уверен, что это самый красивый способ) примерно следующим кодом:

    $myRegEx  = '[\\/:"*@^$?<>|\r\n]+'
    $message = "Внимание! Исключите из названия спецсимволы"
    
    if ([regex]::IsMatch($NewFolderName,$myRegEx )) 
    {
    $properties.Cancel = $true
    $properties.ErrorMessage = $message
    exit
    }

    Метод IsMatch вернет истину, если в пути содержатся символы которые находит регулярное выражение.

    http://xaegr.wordpress.com/2010/04/09/regexp-8-regex/

    3) URL можно получить из свойств  $NewFolderItem

    http://msdn.microsoft.com/ru-ru/library/microsoft.sharepoint.spfolder(v=office.12).aspx

    http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistitem.aspx


    4) Вполне нормальное решение у Вас с DisableEventFiring()

    P.S. Вот программа, которая поможет в написание Regex, а так же содержит библиотеку готовых

    http://www.regexbuddy.com/ 

    • Изменено Никита Каюров 14 марта 2012 г. 5:42
    • Помечено в качестве ответа RitroF 15 марта 2012 г. 9:20
    14 марта 2012 г. 5:39
  • Реализовал так:

    проверка на спецсимволы

    function ItemAdding
    {
    	$tag = "ItemAdding"
    	$myRegEx  = '[\\/:~%#&"*{}.@^$?<>|\r\n]+'
    	$message = "Внимание! Исключите из названия спецсимволы"
    
    	$ItemName = $properties.AfterProperties["Title"]
    	log $tag $ItemName
    
    	if ([regex]::IsMatch($ItemName,$myRegEx )) 
    	{
    		$properties.Cancel = $true
    		$properties.ErrorMessage = $message
    	}
    }
    

    Создание папки для элемента и копирование ссылки.

    function ItemAdded
    {
    	$tag = "ItemAdded"
    	$NewFolderName = $item.Name
    	$ListDisplayName = "Документы"
    	$WebURL= "https://kr.ts.ru/t/d/mct"
    
    	$Site = New-Object Microsoft.sharepoint.spsite($WebURL)
    	$Web = $Site.OpenWeb()
    
    	$List = $Web.Lists[$ListDisplayName]
    	$FolderName = $List.RootFolder
    
    	$NewFolderItem = $List.Items.Add($ItemSubSub.ServerRelativeUrl,[Microsoft.SharePoint.SPFileSystemObjectType]::Folder,$NewFolderName)
    
    	$this.DisableEventFiring()
    
    	$NewFolderItem.SystemUpdate()
    	$List.Update()
    	$item["URLFolder"] = $Web.URL+"/"+$NewFolderItem.URL + ", " + "Ссылка на папку"
    	$item.Update()
    
    	 log $tag $StUrl
    	 log $tag "url set"
    	$this.EnableEventFiring()
    }
    
    Никита БОЛЬШОЕ СПАСИБО ЗА ПОМОЩЬ!!!


    • Помечено в качестве ответа RitroF 15 марта 2012 г. 9:21
    15 марта 2012 г. 9:18

Все ответы

  • Имя папки я бы проверил при помощи регулярного выражения(не уверен, что это самый красивый способ) примерно следующим кодом:

    $myRegEx  = '[\\/:"*@^$?<>|\r\n]+'
    $message = "Внимание! Исключите из названия спецсимволы"
    
    if ([regex]::IsMatch($NewFolderName,$myRegEx )) 
    {
    $properties.Cancel = $true
    $properties.ErrorMessage = $message
    exit
    }

    Метод IsMatch вернет истину, если в пути содержатся символы которые находит регулярное выражение.

    http://xaegr.wordpress.com/2010/04/09/regexp-8-regex/

    3) URL можно получить из свойств  $NewFolderItem

    http://msdn.microsoft.com/ru-ru/library/microsoft.sharepoint.spfolder(v=office.12).aspx

    http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistitem.aspx


    4) Вполне нормальное решение у Вас с DisableEventFiring()

    P.S. Вот программа, которая поможет в написание Regex, а так же содержит библиотеку готовых

    http://www.regexbuddy.com/ 

    • Изменено Никита Каюров 14 марта 2012 г. 5:42
    • Помечено в качестве ответа RitroF 15 марта 2012 г. 9:20
    14 марта 2012 г. 5:39
  • В скрипте не работает добавление URL созданной папки в столбец URLFolder

    Как грамотно написать такое, что бы в итоге у элемента в столбце URLFolder стояла красивая ссылка на созданную папку

    function ItemAdded

    {
    $tag = "ItemAdded"
    $NewFolderName = $item.Name
    $ListDisplayName = "Документы"
    $WebURL= "https://kr.ru/dsa/task"

    $Site = New-Object Microsoft.sharepoint.spsite($WebURL)
    $Web = $Site.OpenWeb()
    # write-host $Web.URL
    $List = $Web.Lists[$ListDisplayName]
    $FolderName = $List.RootFolder
    # write-host $FolderName.SubFolders
    $NewFolderItem = $List.Items.Add($ItemSubSub.ServerRelativeUrl,[Microsoft.SharePoint.SPFileSystemObjectType]::Folder,$NewFolderName)
    $this.DisableEventFiring()

    $NewFolderItem.SystemUpdate()
    $List.Update()
    log $tag $item["Title"]

    show_objects_fields
    log $tag $NewFolderItem.URL
    $item["URLFolder"] = $NewFolderItem.URL

    $item.Update()
    log $tag "url set"
    $this.EnableEventFiring()
    }

    15 марта 2012 г. 5:21
  • Всем спасибо!

    Реализовал скрипт.)

    15 марта 2012 г. 7:42
  • Как установить отображаемый URL красивого вида "Ссылка на папку"?

    $item["URLFolder"] = $Web.URL+"/"+$NewFolderItem.URL

    $item.Update()

    Сейчас я получаю полный URL в столбце URLFolder. 

     
    15 марта 2012 г. 8:06
  • Сделать  XSL шаблон
    15 марта 2012 г. 8:38
  • Реализовал так:

    проверка на спецсимволы

    function ItemAdding
    {
    	$tag = "ItemAdding"
    	$myRegEx  = '[\\/:~%#&"*{}.@^$?<>|\r\n]+'
    	$message = "Внимание! Исключите из названия спецсимволы"
    
    	$ItemName = $properties.AfterProperties["Title"]
    	log $tag $ItemName
    
    	if ([regex]::IsMatch($ItemName,$myRegEx )) 
    	{
    		$properties.Cancel = $true
    		$properties.ErrorMessage = $message
    	}
    }
    

    Создание папки для элемента и копирование ссылки.

    function ItemAdded
    {
    	$tag = "ItemAdded"
    	$NewFolderName = $item.Name
    	$ListDisplayName = "Документы"
    	$WebURL= "https://kr.ts.ru/t/d/mct"
    
    	$Site = New-Object Microsoft.sharepoint.spsite($WebURL)
    	$Web = $Site.OpenWeb()
    
    	$List = $Web.Lists[$ListDisplayName]
    	$FolderName = $List.RootFolder
    
    	$NewFolderItem = $List.Items.Add($ItemSubSub.ServerRelativeUrl,[Microsoft.SharePoint.SPFileSystemObjectType]::Folder,$NewFolderName)
    
    	$this.DisableEventFiring()
    
    	$NewFolderItem.SystemUpdate()
    	$List.Update()
    	$item["URLFolder"] = $Web.URL+"/"+$NewFolderItem.URL + ", " + "Ссылка на папку"
    	$item.Update()
    
    	 log $tag $StUrl
    	 log $tag "url set"
    	$this.EnableEventFiring()
    }
    
    Никита БОЛЬШОЕ СПАСИБО ЗА ПОМОЩЬ!!!


    • Помечено в качестве ответа RitroF 15 марта 2012 г. 9:21
    15 марта 2012 г. 9:18
  • В SP 2010 вместо

    $Site = New-Object Microsoft.sharepoint.spsite($WebURL)
    $Web
    = $Site.OpenWeb()

    Можно использовать

    $Web = Get-SPWeb $WebURL


    SharePoint MCPD, MCITP. Высказанное мною здесь - мои личные взгляды, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    15 марта 2012 г. 10:27
    Модератор
  • В PowerShell есть собственная операция -match. Примеры найдёте по команде help about_regular_expression

    15 марта 2012 г. 13:01
    Отвечающий
  • Подскажите пожалуйста как просто и правильно реализовать?

    Есть список с задачами, в столбце Descriptions содержится описание задачи, необходимо скопировать строки, что между символами @@ и  @@ в другой столбец.
    Если же символов @@ вообще нет или нет закрывающей пары то можно просто первые 5 строк текста скопировать.

    P.S. Реализовать с помощью Designer не удалось, так как работа со строками сильно ограниченна. 


    • Изменено RitroF 20 марта 2012 г. 7:00
    20 марта 2012 г. 6:47
  • Для поиска таких подстрок снова нам поможет RegExp, на сей раз такой @@([^}]*)@@

    можно добавить кастомную workflow activity для sharepoint designer для поиска таких подстрок и тем самым расширить функционал, раз стандартного не хватает. Ниже ссылка на пример создания SPD Workflow Activity 

    https://msmvps.com/blogs/sundar_narasiman/archive/2010/12/26/develop-custom-workflow-activity-for-sharepoint-2010-workflow.aspx



    20 марта 2012 г. 9:06
  • Пытаюсь так реализовать код, но не выходит, что делаю не так?

    $SpSite = New-Object "Microsoft.SharePoint.SPSite" ("URL")
    $SpWeb = $SpSite.OpenWeb("URLWeb")
    $SpList = $SpWeb.GetList("URLList")
    
    $ItemTaskDes = $SpList.Items[2]["Описание"]
    $RegEx  = '@@(.*)@@'
    $match = [regex]::Match($ItemTaskDes,$RegEx)
    
    
    if ($match.Groups[1].value -ne null)
    {
      $SpList.Items[2]["описание2"] = $match.Groups[1].value
      $item.Update()
    }



    • Изменено RitroF 23 марта 2012 г. 9:19
    23 марта 2012 г. 9:17
  • "не выходит" что означает? Ошибка выбрасывается?

    Русские названия столбцов могут усложнить вам жизнь в будущем. Возможно и в этом коде русские названия вам и мешают.


    SharePoint MCPD, MCITP. Высказанное мною здесь - мои личные взгляды, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    23 марта 2012 г. 16:10
    Модератор
  • Пытаюсь так реализовать код, но не выходит, что делаю не так?

    $SpSite = New-Object "Microsoft.SharePoint.SPSite" ("URL")
    $SpWeb = $SpSite.OpenWeb("URLWeb")
    $SpList = $SpWeb.GetList("URLList")
    
    $ItemTaskDes = $SpList.Items[2]["Описание"]
    $RegEx  = '@@(.*)@@'
    $match = [regex]::Match($ItemTaskDes,$RegEx)
    
    
    if ($match.Groups[1].value -ne null)
    {
      $SpList.Items[2]["описание2"] = $match.Groups[1].value
      $item.Update()
    }


    На сомом деле поле "Описание" имеет отличный от отображаемого имени internal name, чтобы узнать internal name - зайдите в ностройки списка, выберите это поле и щелкните по нему. Когда перейдете на страницу свойств поля - обратите внимание на URL - там будет параметр Field который и будет равен internal name (имя созданного  русского поля будет корявым, и Вы увидите примерно следующее(жирным выделено имя) :  Field=_x20__x45__x56). Второе : 

    В остальном - ждем текста ошибки :)

    24 марта 2012 г. 4:45
  • Проблема в присвоении 

     $SpList.Items[2]["описание2"] = $match.Groups[1].value

    даже если сделать так

     $SpList.Items[2]["описание2"] = "123"

    Значение не присваивается

    Посмотрел  Field=desc

    Возможно дело в типе или свойствах поля?

    <label for="onetidTypeMultiText">- Многострочный текст</label>

    Дополнительные параметры столбца

    <label for="onetidRichText">Укажите разрешаемый тип текста:</label>

    - Обычный

    <label for="onetidAppendOnly">Внесение изменений в существующий текст</label>
    - Нет
    29 марта 2012 г. 4:18
  • Ну раз Field=desc значит у поля описание2 internal name = desc, его и следует использовать:

     $SpList.Items[2]["desc"] = "123"

    29 марта 2012 г. 6:14
  • Сейчас поле desc содержит текст"Тест" Проверяю значение поля "desс" после команды, без изменений = "Тест". Побывал с простым текстовым полем, так же.

    $SpList.Items[2]["desc"] = "123"

    Возможно чего то не хватает в скрипте?
    • Изменено RitroF 29 марта 2012 г. 6:36
    29 марта 2012 г. 6:36
  • Подскажите как правильно написать регулярное выражение.

    Не понял я до конца еще регулярки.

    Раньше использовал $RegEx  = '@@(.*)@@'

    Но в этом примере не работает.

    $RegEx  = '@@(.*)@@'
    
    g $ = "нам @@
    Задача завершена, диагностика подтвердила анализ кода
    Дополнительно достигнута договоренность о признании
    с поднятия служб
    @@
    From: Владимирович Sent:"
    
    $match = [regex]::Match($g,$RegEx)


    5 апреля 2012 г. 7:47
  • Для поиска таких подстрок снова нам поможет RegExp, на сей раз такой @@([^}]*)@@

    можно добавить кастомную workflow activity для sharepoint designer для поиска таких подстрок и тем самым расширить функционал, раз стандартного не хватает. Ниже ссылка на пример создания SPD Workflow Activity 

    https://msmvps.com/blogs/sundar_narasiman/archive/2010/12/26/develop-custom-workflow-activity-for-sharepoint-2010-workflow.aspx



    Выше я Вам написал уже его :) вот : @@([^}]*)@@


    6 апреля 2012 г. 5:07
  • Никита огромное спасибо

    Вот, что получилось у меня в итоге в ilovesharepoint:

    function is_workprocess() {
    	if( $properties.AfterProperties["ContentTypeId"] -eq $null ) {
    		return $true
    	} else {
    		return	$false	
    	}
    }
    
    
    function ItemAdding
    {
    # show_param
     trap 
     {		
    	$message = $_.Exception.GetType( ).FullName + " | " + $_.Exception.Message		
    	log $tag $message		
    	continue
     }
    
    #// Получаем свойство -описание задачи	
    
    	$tag = "ItemUpdating"
    	$RegEx  = '@@([^}]*)@@'
    	$ItemDescr = $properties.AfterProperties["Body"]
    	$match = [regex]::Match($ItemDescr,$RegEx)
    	$value = $match.Groups[1].value
    	
    	log $tag $ItemDescr	
    	log $tag $value
    
    #// Если есть регулярное выражение скопировать тект
    
    	$tag = "ItemVar"
    	$properties.AfterProperties["namefield"] = $value
     	
    
    }
    
    function ItemUpdating
    {
    # show_param
    is_workprocess
     trap 
     {		
    	$message = $_.Exception.GetType( ).FullName + " | " + $_.Exception.Message		
    	log $tag $message		
    	continue
     }
    
    #// Получаем свойство -описание задачи (проверяем нет ли запущенного WF)   	
    
    $is_wp = is_workprocess
    
    if ( !($is_wp) )
    {
    	$tag = "ItemUpdating"
    	$RegEx  = '@@([^}]*)@@'
    	$ItemDescr = $properties.AfterProperties["Body"]
    	$match = [regex]::Match($ItemDescr,$RegEx)
    	$value = $match.Groups[1].value
    	
    	log $tag $ItemDescr	
    	log $tag $value
    
    #// Если есть регулярное выражение скопировать тект
    
    	$tag = "ItemVar"
    	$properties.AfterProperties["namefield"] = $value
    }
    }
    

    9 апреля 2012 г. 5:03