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

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

Ответить
Настройки темы
PowerShell - [решено] Распарсить строку

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


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

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


Это снова я)

Итак мой скрипт на синхронизацию контактов Exchange

Код: Выделить весь код
Param(
[string] $csv
)
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$zz = 0
$z = $zz
$string = $_.OU
Import-Csv $csv | ForEach-object -process `
{`
$EEA =  $_.E
$name = $_.A
try {New-MailContact `
	     -ExternalEmailAddress $EEA `
		 -Name $_.N `
		 -Alias $_.A `
		 -FirstName $_.FN `
		 -Initials $_.I `
		 -LastName $_.LN `
		 -OrganizationalUnit $_.OU -WarningAction SilentlyContinue -ErrorAction Stop | Set-MailContact -CustomAttribute11 $_.D -WarningAction SilentlyContinue; Write-Host $name  "......Create" -ForegroundColor Green; $z = $zz + 1}
   catch {
	if($_.CategoryInfo.Reason -eq "ADObjectAlreadyExistsException") {
Get-Contact $name
Get-ADOrganizationalUnit -Filter 'name -eq "domen.ru/Контакты/еще/чтото/аВотПоследнееМнеНужно"'
if((Get-Contact $name).WindowsEmailAddress -ne $EEA){
Set-MailContact -Identity $name -ExternalEmailAddress $EEA;Write-Host $name  -ForeGround Magenta;Write-Host "................Already Exists, BUT not Actual....Replace Email" -ForegroundColor Red}
if((Get-Contact $name).WindowsEmailAddress -eq $EEA){
Write-Host $name  -ForeGround Magenta;Write-Host "................Already Exists and Actual" -ForegroundColor Green}
if((Get-Contact $name).OrganizationalUnit -ne $_.OU){Move-ADObject (Get-Contact $name).Guid  -TargetPath (Get-ADOrganizationalUnit $аВотПоследнееМнеНужно).ObjectGUID}
}
}
}
В csv файлике OU вида domen.ru/Контакты/еще/чтото/аВотПоследнееМнеНужно, тоесть нужно спарсить содержимое строке после последнего знака "/"

Отправлено: 14:46, 01-07-2014

 

Ветеран


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

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


Код: Выделить весь код
PS > "domen.ru/Контакты/еще/чтото/аВотПоследнееМнеНужно".split("/")[-1]
аВотПоследнееМнеНужно
А зачем постоянно вызывать Get-Contact $name. Почему не использовать переменную?

Код: Выделить весь код
Import-Csv $csv | ForEach-Object -Process `
{`
	$EEA =  $_.E
	$Name = $_.A
	$OU = $_.OU
	..............
	catch {
			if($_.CategoryInfo.Reason -eq "ADObjectAlreadyExistsException") {
			$AOU = $OU.split("/")[-1]
			$contact = Get-Contact $name
			$AOU = Get-ADOrganizationalUnit -Filter 'name -eq "$AOU"'
			
			if($contact.WindowsEmailAddress -ne $EEA){
				Set-MailContact -Identity $name -ExternalEmailAddress $EEA
				Write-Host $name  -ForeGround Magenta
				Write-Host "................Already Exists, BUT not Actual....Replace Email" -ForegroundColor Red
			}
			else {
				Write-Host $name -ForeGround Magenta
				Write-Host "................Already Exists and Actual" -ForegroundColor Green
			}

			if($contact.OrganizationalUnit -ne $OU) {
				Move-ADObject $contact.Guid -TargetPath $AOU
			}
		}
	}
}
Это сообщение посчитали полезным следующие участники:

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



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

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


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


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

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


$AOU = $OU.split("/")[-1]

-1 значит первый символ / с конца строки? а если 1 то сначала строки?

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


Ветеран


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

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


Последний символ строки:
Код: Выделить весь код
PS > "abcdeded"[-1]
d
Первый:
Код: Выделить весь код
PS > "abcdeded"[0]
a
Второй:
Код: Выделить весь код
PS > "abcdeded"[1]
b
Код: Выделить весь код
PS > "domen.ru/Контакты/еще/чтото/аВотПоследнееМнеНужно".split("/")
domen.ru
Контакты
еще
чтото
аВотПоследнееМнеНужно
Первый объект в массиве:
Код: Выделить весь код
PS > "domen.ru/Контакты/еще/чтото/аВотПоследнееМнеНужно".split("/")[0]
domen.ru
Последний объект в массиве:
Код: Выделить весь код
PS > "domen.ru/Контакты/еще/чтото/аВотПоследнееМнеНужно".split("/")[-1]
аВотПоследнееМнеНужно
Первый символ первого объекта в массиве:
Код: Выделить весь код
PS > "domen.ru/Контакты/еще/чтото/аВотПоследнееМнеНужно".split("/")[0][0]
d
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:04, 01-07-2014 | #4


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


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

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


$AOU = Get-ADOrganizationalUnit -Filter 'name -eq "$AOU"'
Тут наверно должна быть другая переменная?
-------
Что-то не проходит Move-Adobject

Код: Выделить весь код
Param(
[string] $csv
)
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$zz = 0
$z = $zz
Import-Csv $csv | ForEach-object -process `
{`
$EEA =  $_.E
$name = $_.A
$OU = $_.OU
try {New-MailContact `
	     -ExternalEmailAddress $EEA `
		 -Name $_.N `
		 -Alias $_.A `
		 -FirstName $_.FN `
		 -Initials $_.I `
		 -LastName $_.LN `
		 -OrganizationalUnit $_.OU -WarningAction SilentlyContinue -ErrorAction Stop | Set-MailContact -CustomAttribute11 $_.D -WarningAction SilentlyContinue; Write-Host $name  "......Create" -ForegroundColor Green; $z = $zz + 1}
	catch {
			if($_.CategoryInfo.Reason -eq "ADObjectAlreadyExistsException") {
			$AOU = $OU.split("/")[-1]
			$contact = Get-Contact $name
			$OU1 = Get-ADOrganizationalUnit -Filter 'name -eq "$AOU"'
			
			if($contact.WindowsEmailAddress -ne $EEA){
				Set-MailContact -Identity $name -ExternalEmailAddress $EEA -WarningAction SilentlyContinue
				Write-Host $name  -ForeGround Magenta
				Write-Host "................Already Exists, BUT not Actual....Replace Email" -ForegroundColor Red
			}
            if($contact.OrganizationalUnit -ne $OU) {
				Move-ADObject $contact.Guid -TargetPath $OU1.ObjectGUID -WarningAction SilentlyContinue
                Write-Host $name -ForeGround Magenta
				Write-Host "................Already Exists, BUT Diferent OU....I changed " -ForegroundColor Red
			}
			else {
				Write-Host $name -ForeGround Magenta
				Write-Host "................Already Exists and Actual" -ForegroundColor Green
			}

			
		}
	}
}
Как делать дебаг Powershell скриптов?

Отправлено: 06:41, 02-07-2014 | #5


Ветеран


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

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


$AOU = Get-ADOrganizationalUnit -Filter 'name -eq "$AOU"' - Необязательно.

Код: Выделить весь код
PS > $a = 5
PS > $a
5
PS > $a = $a * 2
PS > $a
10
Move-Adobject - Предполагаете, что надо обязательно угадывать ошибки? В чем сложность привести вывод ошибок?

Отправлено: 08:09, 02-07-2014 | #6


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


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

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


Затык был такой :

Код: Выделить весь код
[Root:] C:\Exchange> Get-ADOrganizationalUnit -Filter 'name -eq "контакты"'


City                     :
Country                  :
DistinguishedName        : OU=Контакты,DC=ava-nissan,DC=ru
LinkedGroupPolicyObjects : {}
ManagedBy                :
Name                     : Контакты
ObjectClass              : organizationalUnit
ObjectGUID               : 417e08a1-38f5-4c5a-bd6a-e7395545e37d
PostalCode               :
State                    :
StreetAddress            :
[Root:] C:\Exchange> $AOU = Get-ADOrganizationalUnit -Filter 'name -eq "контакты"'
[Root:] C:\Exchange> $AOU.ObjectGUID

Guid
----
417e08a1-38f5-4c5a-bd6a-e7395545e37d

все ок, но если копнуть глубже в лес домена

Код: Выделить весь код
[Root:] C:\Exchange> $AOU = Get-ADOrganizationalUnit -Filter 'name -eq "контакты/****"'
[Root:] C:\Exchange> $AOU.ObjectGUID

Guid
----
8d273639-ae0a-49a4-992b-b2f11effdb16
78051762-3ea2-47be-b1b3-a1fada6fb331
И тут просто повезло, что нужен последний и ВЫ уже показали как это использовать

Код: Выделить весь код
[Root:] C:\Exchange> $AOU.ObjectGUID[-1]

Guid
----
78051762-3ea2-47be-b1b3-a1fada6fb331

Отправлено: 11:18, 02-07-2014 | #7



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2003/XP/2000 - Распарсить XLS и получить интересующие данные во внешний файл bagfinder Microsoft Office (Word, Excel, Outlook и т.д.) 14 29-01-2014 14:41
В одну строку..... Vienna7 Вебмастеру 6 02-07-2013 10:05
CMD/BAT - Чем бы распарсить .doc ? mitiya Скриптовые языки администрирования Windows 5 29-11-2010 14:14
.NET - Вычислить строку в C# SmallGod Программирование и базы данных 1 26-02-2010 01:19
Интерфейс - Нужен твик -убрать в проводнике "Избранные ссылки", адресную строку и строку поиска Mishechka Microsoft Windows Vista 18 16-09-2008 16:19




 
Переход