-->

пятница, 21 марта 2014 г.

Импорт и создание элементов списка SP с проверкой при помощью PowerShell


Как я рассказывал  ранее, у меня есть список, в котором находятся перечень сотрудников компании. Мне надоело создавать новые элементы руками самостоятельно, и решил прибегнуть к PowerShell.
Т.к. в моей компании первично заводят данные в учетную систему, далее создается пользователь в AD, то я попросил коллег, что бы мне выгружали всех новых сотрудников в файл. Полученный файл я импортировал в PowerShell, и уже работал с массивом из пользователей.


Расскажу подробней о своем способе решения:
1. Для начала я импортирую файл в PowerShell. Подробно об этом писал Слукин Сергей
при импорте получаем


2. Полученный массив пробегаем циклом и если элемент массива не пуст, то для него запускаем проверку на существование карточки в списке Сотрудники.
 3.  Проверка на существование карточки для пользователя происходит следующим образом, у меня в карточке сотрудника есть поле «Пользователь» в котором указан пользователь SharePoint. И если в списке нет элементов с проверяемыми учетными данными, то создаем новый элемент.
4. Создание нового элемента, при этом сразу заполняются основные данные сотрудника (Фамилия, Имя, Отчество, Инициалы)
так на выходе




Cам скрипт:

if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) {

 Add-PSSnapin Microsoft.SharePoint.PowerShell;} #добавляем снапин SP

function ImportFile ($path)
{
    $import = Import-Csv -Delimiter "`t" -Path  $path # импортируем файл
    foreach($importUser in $import)
    {
     if ($importUser.login -ne "") #проверяем что элемент массива не пуст
    {
           CheckItemUserList $importUser 
    }
    }
}

function CheckItemUserList ($checkUser) # проверяем сколько записей с таким пользователем есть
{   
    $web = Get-SPWeb $urlWeb 
    $list = $web.Lists[$nameList] 
    $items = $list.Items
    $countItem = 0
    foreach ($item in $items)
    {        
                  
        #$item["SystemUser"].ToString();          
        $userfield = New-Object Microsoft.SharePoint.SPFieldUserValue($web,$item["SystemUser"].ToString());         
        if ($userfield.User.UserLogin -eq $checkUser.Login)  
        {
            $countItem = $countItem + 1
        }                
    }  
    Write-Host "Количество записей с логином" $checkUser.Login - $countItem    -ForegroundColor Blue
    if ($countItem -eq 0)
    {        
       AddItemUserList $checkUser
    }
    else 
    {   
     $web.Dispose()     
    }
}

function AddItemUserList ($addImportUser)
{      
            #развиваем ФИО на имя, фамилию отчество и формируем инициалы
$split = $addImportUser.name -split " "
$lastname  = $split[0]
$firstname = $split[1]
        $middleName = $split[2]
        $initials = $split[1].substring(0,1) + "." + $split[2].substring(0,1) +"."        
        
        # Вот в этом блоке нужно произвести замену на свои названия полей которые находятся в []
        
        $addItem = $list.AddItem()
        $addItem['Title'] = $lastname + " " + $initials
        $addItem['LastNamePhonetic'] = $lastname
        $addItem['FirstName'] = $firstname
        $addItem['MiddleName'] = $middleName
        $addItem['Initials'] = $initials
        $addItem['SystemUser'] = $web.EnsureUser($addImportUser.login);
        $addItem.Update()
        Write-Host "Элемент с именем "  $lastname  $initials "создан." -ForegroundColor Green
        $web.Dispose() 
}

 $pachFile = 'C:\export\importUserList.txt' #заменить на путь файла
 $urlWeb = 'http://site' #заменить на адрес сайта
 $nameList = 'Подразделения и сотрудники' #заменить название списка
 ImportFile ($pachFile)

Как пользоваться:
по мимо того что нужно заменить 3 нижние переменные на Ваши, так еще придется поменять название полей списка, в которые будут записываться данные. Как совет, использовать имена полей на латинице.