 |
|
Распарсить строку
Это снова я)
Итак мой скрипт на синхронизацию контактов 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/Контакты/еще/чтото/аВотПоследнееМнеНужно, тоесть нужно спарсить содержимое строке после последнего знака "/"
|
Код:
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
}
}
}
}
|
$AOU = $OU.split("/")[-1]
-1 значит первый символ / с конца строки? а если 1 то сначала строки?
|
Последний символ строки:
Код:
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
|
$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 скриптов?
|
$AOU = Get-ADOrganizationalUnit -Filter 'name -eq "$AOU"' - Необязательно.
Код:
PS > $a = 5
PS > $a
5
PS > $a = $a * 2
PS > $a
10
Move-Adobject - Предполагаете, что надо обязательно угадывать ошибки? В чем сложность привести вывод ошибок?
|
Затык был такой :
Код:
[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
|
Время: 17:00.
© OSzone.net 2001-