Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Сравнение данных в строке csv-файла с данными из строки в списке SharePoint 2010

Ответить
Настройки темы
PowerShell - [решено] Сравнение данных в строке csv-файла с данными из строки в списке SharePoint 2010

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Вот, что у меня пока получилось :
Выгрузка в 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() 
}
Прошу хотя-бы пример кода, как сравнивать строчку со значениями.
Или у меня изначально алгоритм неверно выбран?

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

Отправлено: 11:05, 17-07-2014

 

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Нашёл на форуме нечто похожее. Попробовал вот так :
Код: Выделить весь код
$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" - становится пустым.

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

Отправлено: 15:07, 17-07-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Не тестировал, т.к. нет 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()
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:40, 17-07-2014 | #3


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


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

$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-...5665469&sr=1-4

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

Отправлено: 10:39, 18-07-2014 | #4


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Итак, получилось 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.

Отправлено: 10:43, 22-07-2014 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Сравнение данных в строке csv-файла с данными из строки в списке SharePoint 2010

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - [решено] Добавление информации из csv-файла в AD с обработкой IvanXXL Скриптовые языки администрирования Windows 12 23-07-2014 10:49
CMD/BAT - [решено] Периеминование файла doc.csv в Документ_дата_время.csv kagorec Скриптовые языки администрирования Windows 2 29-03-2014 18:40
CMD/BAT - [решено] Сравнение папок из коммандной строки с логом nbds Скриптовые языки администрирования Windows 5 24-10-2011 21:58
Sharepoint - [решено] Sharepoint Server 2010: возможно ли встраивание данных о версии документа в его имя? Ashtoret Другие серверные продукты 2 20-06-2011 09:37
2010 - SharePoint 2010 – краткое сравнение обновленных функций OSZone Microsoft Office (Word, Excel, Outlook и т.д.) 0 25-03-2010 01:30




 
Переход