none
Создать в PowerShell экземпляр рабочего процесса. RRS feed

  • Вопрос

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

    Подскажите пожалуйста, знающие люди, как можно при помощи PowerShell - скрипта запустить Уже готовый рабочий процесс в фоне?

    Я поясню: есть рабочий процесс "Утверждение", который запускается, рассылает задачи согласующим, те, в свою очередь получают форму задачи с кнопкой "Утвердить".

    Если жмут кнопку "Утвердить" - процесс согласования продвигается дальше, если "Отклонить" - всё прекращается.

    Каким образом, программно (например при помощи PowerShell-скрипта) нажать кнопку "Утвердить" в этой самой задаче? 
    Я надеюсь что объяснил понятно..

    4 августа 2017 г. 5:04

Ответы

Все ответы

  • Добрый день

    Если нужно утвердить попробуйте так

    $web = Get-SPWeb http://sites/Site
    $List = $web.Lists["Задачи"]
    $items = $List.Items
    $itemId = 8 # Id обновляемого элемента
    foreach($item in $items)
    {
        if($item.Id -eq  $itemId)
        {
             write-host $item.Name $item.Id  
             $item['WorkflowOutcome']='Утверждено'
             $item['ExtendedProperties'] = $item['ExtendedProperties'] + "ows_TaskStatus='Утверждено' ows_FieldName_Comments=''"         
             $item['PercentComplete']= 1
             $item['Completed']=1
             $item['Status']= 'Завершена'
             $item.Update()
        }     
    }
    $web.Dispose()


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


    4 августа 2017 г. 7:19
    Модератор
  • решение не идеально, лучше выборку делать через CAML, а не пробегать по всем 

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

    4 августа 2017 г. 7:20
    Модератор
  • Выборка через CAMLQuery о которой говорил Kaplin Vladimir будет примерно такой:

    $URL = "http://contoso" $site = New-Object Microsoft.SharePoint.SPSite($URL) $web = $site.openweb("") $list=$web.Lists["YOURLIST"] $listname = $list.title $spQuery = New-Object Microsoft.SharePoint.SPQuery

    $camlQuery ="<Where><Eq><FieldRef Name='ID' /><Value Type='Integer'>1</Value></Eq></Where>" $spQuery.Query = $camlQuery $spQuery.RowLimit = 100 $spListItems = $list.GetItems($spQuery) Write-Host "spListItems :" $spListItems foreach ($item in $spListItems) { $item['WorkflowOutcome']='Утверждено' $item['ExtendedProperties'] = $item['ExtendedProperties'] + "ows_TaskStatus='Утверждено' ows_FieldName_Comments=''" $item['PercentComplete']= 1 $item['Completed']=1 $item['Status']= 'Завершена' $item.Update() } $web.Dispose()



    4 августа 2017 г. 8:17
  • да, Mikhail Zhuykov

    я тоже уже накидал аналогичный скрипт Утверждение задач WorkFlow через PowerShell


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

    4 августа 2017 г. 8:19
    Модератор
  • да, Mikhail Zhuykov

    я тоже уже накидал аналогичный скрипт Утверждение задач WorkFlow через PowerShell


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

    Спасибо за пост :)
    4 августа 2017 г. 8:20
  • Всем огромное спасибо. Сейчас пробовать буду.
    4 августа 2017 г. 8:21
  • да, Mikhail Zhuykov

    я тоже уже накидал аналогичный скрипт Утверждение задач WorkFlow через PowerShell


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

    Спасибо за пост :)
    и вам спасибо :)

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

    4 августа 2017 г. 8:22
    Модератор
  • Коллеги, у меня получилось найти нужную задачу, с которой я буду вести в дальнейшем работу.
    Вот скрипт:

    $env:SPpath = "${env:CommonProgramFiles}\Microsoft Shared\web server extensions\16\"
    [System.Reflection.Assembly]::LoadFrom("$env:SPPath\ISAPI\Microsoft.SharePoint.dll")
    
    $SpSite = New-Object -TypeName "Microsoft.SharePoint.SPSite" -ArgumentList "http://portal/projects";
    $SpWeb = $SpSite.OpenWeb();
    $SpList = $SpWeb.GetList("http://portal/projects/Lists/List/AllItems.aspx");
    $taskTitle = "Утвердите Акт закрытия проекта для ABCDE";
    
    if ($SpList -ne $null) {    
        foreach ($item in $SpList.Items) {
            if(($item.Name -eq $taskTitle) -and ($item['Status'] -eq "Не начата")) {
             Write-Host $item.Name: $item['Status']: $item['Completed'];
            }
        }    
    }
    

    тут в "$item" я получаю "ссылку" на нужную мне задачу.

    Теперь мне нужно переназначить задачу конкретной учетной записе допустим DOMAIN\user ?


    4 августа 2017 г. 10:23
  • Коллеги, у меня получилось найти нужную задачу, с которой я буду вести в дальнейшем работу.
    Вот скрипт:

    $env:SPpath = "${env:CommonProgramFiles}\Microsoft Shared\web server extensions\16\"
    [System.Reflection.Assembly]::LoadFrom("$env:SPPath\ISAPI\Microsoft.SharePoint.dll")
    
    $SpSite = New-Object -TypeName "Microsoft.SharePoint.SPSite" -ArgumentList "http://portal/projects";
    $SpWeb = $SpSite.OpenWeb();
    $SpList = $SpWeb.GetList("http://portal/projects/Lists/List/AllItems.aspx");
    $taskTitle = "Утвердите Акт закрытия проекта для ABCDE";
    
    if ($SpList -ne $null) {    
        foreach ($item in $SpList.Items) {
            if(($item.Name -eq $taskTitle) -and ($item['Status'] -eq "Не начата")) {
             Write-Host $item.Name: $item['Status']: $item['Completed'];
            }
        }    
    }

    тут в "$item" я получаю "ссылку" на нужную мне задачу.

    Теперь мне нужно переназначить задачу конкретной учетной записе допустим DOMAIN\user ?


    нужно добавить 

        $item['AssignedTo'] = 1 # id пользователя
        $item.Update()


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

    • Предложено в качестве ответа Mikhail Zhuikov 10 августа 2017 г. 9:18
    • Отменено предложение в качестве ответа Mikhail Zhuikov 24 августа 2017 г. 6:26
    4 августа 2017 г. 11:36
    Модератор
  • Владимир, огромнейшее спасибо.

    Буду пробовать.

    21 августа 2017 г. 9:48
  • Попробовал.

    Сработало. Но как то не так как хотелось бы. Я поясню:

    Когда я руками открываю задачу и жму кнопку "Переназначить задачу", возникает диалог, где я среди списка полей указываю того, кому эту задачу переназначить. Жму "Отправить" и эта операция выполняется вполне заметное время. Секунд 30 где то...

    В результате чего, текущая задача принимает состояние "Завершена", создается ещё одна такая же задача, но в поле "Кому назначено" указан уже другой юзер.

    Когда я делаю:

    $item['AssignedTo'] = 1;
    $item.Update();

    Новой задачи не создается, а у текущей, просто меняется исполнитель.

    Как бы мне выполнитиь именно ПЕРВЫЙ сценарий? 

    21 августа 2017 г. 12:11
  • Не понимаю, ведь при переназначении задачи, текущая закрывается и создается новая с другим исполнителем? Это же стандартный функционал?
    21 августа 2017 г. 12:53
  • Т.е. правильно ли я понимаю, что когда делается 

    $item['AssignedTo'] = 1;

    То у ТЕКУЩЕЙ задачи меняется поле "Кому назначено" и всё?

    • Изменено VARD32 22 августа 2017 г. 6:49
    22 августа 2017 г. 6:49
  • по поводу 30 секунд - а вы переделали свой скрипт с использование query, как советовали выше. Скрипт, который вы постили выше, перебирает все элементы, а это долго.
    24 августа 2017 г. 3:16
  • да после изменения поля AssignedTo и применения update, меняется исполнитель задачи.
    24 августа 2017 г. 3:19