Показать полную графическую версию : [решено] Сравнение данных в строке csv-файла с данными из строки в списке SharePoint 2010
Добрый день. Меня зовут Никита, мне 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()
}
Прошу хотя-бы пример кода, как сравнивать строчку со значениями.
Или у меня изначально алгоритм неверно выбран?
Заранее спасибо за любой ответ )
Нашёл на форуме нечто похожее. Попробовал вот так :
$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" - становится пустым.
Что не так? (((
Не тестировал, т.к. нет 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()
}
Для диагностики проверить переменную до и после изменения(и засечь время):
$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 превысил(а) максимальный объем сохраненных персональных сообщений и не может получать новые сообщения, пока не удалит часть старых.
Итак, получилось 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.