Войти

Показать полную графическую версию : [решено] Распарсить строку


milligan
01-07-2014, 14:46
Это снова я)

Итак мой скрипт на синхронизацию контактов 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/Контакты/еще/чтото/аВотПоследнееМнеНужно, тоесть нужно спарсить содержимое строке после последнего знака "/"

Kazun
01-07-2014, 15:26
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
}
}
}
}

milligan
01-07-2014, 15:54
$AOU = $OU.split("/")[-1]

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

Kazun
01-07-2014, 16:04
Последний символ строки:
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

milligan
02-07-2014, 06:41
$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 скриптов?

Kazun
02-07-2014, 08:09
$AOU = Get-ADOrganizationalUnit -Filter 'name -eq "$AOU"' - Необязательно.

PS > $a = 5
PS > $a
5
PS > $a = $a * 2
PS > $a
10

Move-Adobject - Предполагаете, что надо обязательно угадывать ошибки? В чем сложность привести вывод ошибок?

milligan
02-07-2014, 11:18
Затык был такой :

[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




© OSzone.net 2001-2012