Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Распарсить строку (http://forum.oszone.net/showthread.php?t=284430)

milligan 01-07-2014 14:46 2370678

Распарсить строку
 
Это снова я)

Итак мой скрипт на синхронизацию контактов 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 2370700

Код:

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 2370715

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

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

Kazun 01-07-2014 16:04 2370721

Последний символ строки:
Код:

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 2370938

$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 2370949

$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 2371012

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

Код:

[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.

Время: 17:00.
© OSzone.net 2001-