Войти

Показать полную графическую версию : [решено] Сравнение данных в строке csv-файла с данными из строки в списке SharePoint 2010


hax0rz
17-07-2014, 11:05
Добрый день. Меня зовут Никита, мне 26 и я алкоголик ещё только начинаю писать на PS.

Возникла такая непростая (для меня) задачка:
1. Выгрузить список атрибутов некоторых пользователей из AD ---> *.csv
2. Подключиться с списку на SharePoint'e (Таблица, дублирующая *.csv-файл выше)
3. Построчно сравнить csv со списком. (в данном случае, уникальный идентификатор строки - атрибут EmployeeID) --> Файл csv - master, а список в SharePoint - slave.
3.1 Если в списке - нет строки, как в csv - то добавить её.
3.2 Если строка есть, проверить, все ли значения одинаковые, если нет, то записать в список как в csv.

Вот, что у меня пока получилось :sorry: :
Выгрузка в csv:

Get-ADUser -Filter {(ObjectClass -eq "user") -and (employeeID -like "*")}
-Properties employeeID, 1, 2, 3
| sort-object -property Name | Select employeeID, 1, 2, 3
| Export-Csv D:\Contacts.csv -Encoding Unicode -NoTypeInformation
C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe -version 2.0 " & ' D:\to_list.ps1 ' "


Дальше из примеров в интернете удалось состряпать только такое: (просто очистить и залить снова)

to_list.ps1
add-pssnapin microsoft.sharepoint.powershell
$web = Get-SPWeb "http://SP/test"
$list = $web.lists["Test_AD_Import_Export"]
do {$list.items.delete(0)}
until ($list.items.Count -eq 0)
Import-Csv D:\Contacts.csv | ForEach-Object {
$item = $list.items.Add()
$item["employeeID"] = $_.employeeID
$item["1"] = $_.1
$item["2"] = $_.2
$item["3"] = $_.3
$item.update()
}

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

Заранее спасибо за любой ответ )

hax0rz
17-07-2014, 15:07
Нашёл на форуме нечто похожее. Попробовал вот так :

$web = Get-SPWeb "http://SP/test"
$list = $web.lists["Test_AD_Import_Export"]
$items=$spList.Items
$Information = Import-Csv "D:\Contacts.csv" -Delimiter ';'
ForEach ($stroka in $Information){
ForEach ($item in $items){
if ($stroka.employeeID -eq $item["employeeID"]){
if ($item["1"] -eq $stroka.1){}
else {$item["1"] = $stroka.1}}
$item.update()}}

т.е. изменяя значение в колонке "1"в csv - должно измениться и в списке SharePoint

отрабатывает, без ошибок. В списке в строке просто поле "1" - становится пустым.

Что не так? (((

Kazun
17-07-2014, 15:40
Не тестировал, т.к. нет SharePoint:

$web = Get-SPWeb "http://SP/test"
$list = $web.lists["Test_AD_Import_Export"]
$items=$spList.Items

$prop = Write-Output employeeID 1 2 3
$adusers = @{}
$index = @()
Get-ADUser -Filter {(ObjectClass -eq "user") -and (employeeID -like "*")} -Properties $prop | Foreach {
$adusers[$_.employeeID] = $_
}

# Обновляем данные или удалим запись, если нет в AD, но есть на листе
foreach($item in $items) {
$id = $item["employeeID"]
$user = $adusers["$id"]
$index += $id
if($user) {
$prop | Foreach {
if ($user."$_" -ne $item["$_"]) {
$item["$_"] = $user."$_"
}
}
$item.update()
}
else {
$item.delete()
}
}

# Добавляем запись на лист
Compare-Object ($adusers.GetEnumerator() | Foreach {$_.Name}) $index | Where {$_.SideIndicator -eq "<="} | Foreach {
$user = $adusers["$($_.InputObject)"]
$item = $list.items.Add()
$prop | Foreach {
$item["$_"] = $user."$_"
}
$item.update()
}

Kazun
18-07-2014, 10:39
Для диагностики проверить переменную до и после изменения(и засечь время):

$adusers = @{}
Get-ADUser -Filter {(ObjectClass -eq "user") -and (employeeID -like "*")} -Properties $prop | Foreach {
$adusers[$_.employeeID] = $_
}

$adusers["66666"]

И если значения меняются, будем думать дальше. Возможно репликация влияет, т.к. между сайтами, как раз минимально возможное 15 минут.

PS. По поводу книги, можно начать с - http://www.amazon.com/Learn-Windows-PowerShell-Month-Lunches/dp/1617291080/ref=la_B001ILKEJW_1_4?s=books&ie=UTF8&qid=1405665469&sr=1-4

PSS. 1.hax0rz превысил(а) максимальный объем сохраненных персональных сообщений и не может получать новые сообщения, пока не удалит часть старых.

hax0rz
22-07-2014, 10:43
Итак, получилось 2 варианта.

1. Импорт AD в csv и последующий импорт в список SP.
import-module ActiveDirectory
Get-ADUser -Filter {(ObjectClass -eq "user") -and (employeeID -like "*")} -Properties employeeID, name, givenName, sn, mail, title, homePhone, pager, mobile, facsimileTelephoneNumber, physicalDeliveryOfficeName | sort-object -property Name | Select employeeID, name, givenName, sn, mail, title, homePhone, pager, mobile, facsimileTelephoneNumber, physicalDeliveryOfficeName | Export-Csv D:\Contacts.csv -Encoding Unicode -NoTypeInformation
#
#
import-module ActiveDirectory
if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.Sharepoint.Powershell"}) -eq $null) {
Add-PSSnapin Microsoft.Sharepoint.Powershell
}
$web = Get-SPWeb "http://portal/site1"
$list = $web.lists["AD2SP"]
$items = $list.Items
$sprop = @{ "employeeID" = "Табельный"
"Name" = "Полное имя"
"givenName" = "Фамилия"
"sn" = "Имя Отчество"
"mail" = "Адрес электронной почты"
"title" = "Должность"
"homePhone" = "Корп №"
"pager" = "№"
"mobile" = "Мобильный №"
"facsimileTelephoneNumber" = "Городской №"
"physicalDeliveryOfficeName" = "Кабинет"}
$prop = Write-Output employeeID, name, givenName, sn, mail, title, homePhone, pager, mobile, facsimileTelephoneNumber, physicalDeliveryOfficeName

$adusers = @{}
Import-Csv "D:\Contacts.csv" | Foreach {
$adusers[$_.employeeID] = $_
}
$index = @()

foreach($item in $items) {
$id = $item["Табельный"]
$user = $adusers["$id"]
$index += $id
if($user) {
$prop | Foreach {
$p = $sprop["$_"]
if ($user."$_" -ne $item["$p"]) {
$item["$p"] = $user."$_"
}
}
$item.update()
}
else {
$item.delete()
}
}
Compare-Object ($adusers.GetEnumerator() | Foreach {$_.Name}) $index | Where {$_.SideIndicator -eq "<="} | Foreach {
$user = $adusers["$($_.InputObject)"]
$item = $list.items.Add()
$prop | Foreach {
$p = $sprop["$_"]
if ($user."$_" -ne $item["$p"]){
$item["$p"] = $user."$_"
}
}
$item.update()
}
exit

2. Импорт из AD напрямую в SP

import-module ActiveDirectory
if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.Sharepoint.Powershell"}) -eq $null) {
Add-PSSnapin Microsoft.Sharepoint.Powershell
}
$web = Get-SPWeb "http://portal/site1"
$list = $web.lists["AD2SP"]
$items = $list.Items
$sprop = @{ "employeeID" = "Табельный"
"Name" = "Полное имя"
"givenName" = "Фамилия"
"sn" = "Имя Отчество"
"mail" = "Адрес электронной почты"
"title" = "Должность"
"homePhone" = "Корп №"
"pager" = "№"
"mobile" = "Мобильный №"
"facsimileTelephoneNumber" = "Городской №"
"physicalDeliveryOfficeName" = "Кабинет"}
$prop = Write-Output employeeID, name, givenName, sn, mail, title, homePhone, pager, mobile, facsimileTelephoneNumber, physicalDeliveryOfficeName
$adusers = @{}
$index = @()
Get-ADUser -Filter {(ObjectClass -eq "user") -and (employeeID -like "*")} -Properties $prop | Foreach {
$adusers[$_.employeeID] = $_
}
foreach($item in $items) {
$id = $item["Табельный"]
$user = $adusers["$id"]
$index += $id
if($user) {
$prop | Foreach {
$p = $sprop["$_"]
if ($user."$_" -ne $item["$p"]) {
$item["$p"] = $user."$_"
}
}
$item.update()
}
else {
$item.delete()
}
}
Compare-Object ($adusers.GetEnumerator() | Foreach {$_.Name}) $index | Where {$_.SideIndicator -eq "<="} | Foreach {
$user = $adusers["$($_.InputObject)"]
$item = $list.items.Add()
$prop | Foreach {
$p = $sprop["$_"]
if ($user."$_" -ne $item["$p"]){
$item["$p"] = $user."$_"
}
}
$item.update()
}
exit


П.С.: Огромное спасибо пользователю Kazun.




© OSzone.net 2001-2012