none
Текстовый парсер на Powershell RRS feed

  • Вопрос

  • Приветствую всех,
    Есть ли возможность написать на ПоШе парсер?
    К примеру я получаю список всех емаил алиасов:

    Name           : Имя фамилия
    EmailAddresses : {smtp:USer1@company.ru, smtp:Name.user1@company.ru, SMTP:User1@Domain.com}

    Такой текстовый файл, необходимо распарсить и получить на выходе:
    USer1@company.ru
    Name.user1@company.ru
    User1@Domain.com


    Если сообщение было информативным, отметьте его как ответ. И нам приятно и сразу видно ответ на вопрос :-)
    12 сентября 2009 г. 5:34

Ответы

  • > необходимо распарсить и получить на выходе:

    $a=get-content .\1.txt
    $a=$a[1] | %{ $_.replace(":",",") }
    $a=$a | %{ $_.split(",") }
    $a=$a | %{ if ( $_ -match  ".*@.*" ) { $_ } }
    $a | %{ $_.replace("}","") }
    • Помечено в качестве ответа Bakanov Denis 12 сентября 2009 г. 10:22
    12 сентября 2009 г. 9:46
  • >К примеру я получаю список всех емаил алиасов:
    Это больше похоже на объект у которого в свойстве EmailAddresses содержится массив адресов. Никакой парсер здесь не нужен, и даже вреден (снижение производительности, и отбрасывание главного преимущества PowerShell).

    командлет-выдающий-объекты | foreach {$_.EmailAddresses}

    Если вам необходимо сохранить объекты во временный файл, и затем загрузить - используйте командлеты export-clixml и import-clixml.

    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Помечено в качестве ответа Bakanov Denis 12 сентября 2009 г. 11:54
    12 сентября 2009 г. 11:49
    Модератор

Все ответы

  • > необходимо распарсить и получить на выходе:

    $a=get-content .\1.txt
    $a=$a[1] | %{ $_.replace(":",",") }
    $a=$a | %{ $_.split(",") }
    $a=$a | %{ if ( $_ -match  ".*@.*" ) { $_ } }
    $a | %{ $_.replace("}","") }
    • Помечено в качестве ответа Bakanov Denis 12 сентября 2009 г. 10:22
    12 сентября 2009 г. 9:46
  • Tnx, буду направление  теперь есть. буду потихоньку  допиливать под  нужды.
    Если сообщение было информативным, отметьте его как ответ. И нам приятно и сразу видно ответ на вопрос :-)
    • Предложено в качестве ответа Andev 31 июля 2012 г. 7:46
    12 сентября 2009 г. 10:22
  • >К примеру я получаю список всех емаил алиасов:
    Это больше похоже на объект у которого в свойстве EmailAddresses содержится массив адресов. Никакой парсер здесь не нужен, и даже вреден (снижение производительности, и отбрасывание главного преимущества PowerShell).

    командлет-выдающий-объекты | foreach {$_.EmailAddresses}

    Если вам необходимо сохранить объекты во временный файл, и затем загрузить - используйте командлеты export-clixml и import-clixml.

    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Помечено в качестве ответа Bakanov Denis 12 сентября 2009 г. 11:54
    12 сентября 2009 г. 11:49
    Модератор
  • Последовал совету, хочу поместить все  значения в массив

    Get-Mailbox | foreach ($_.EmailAddresses) {
        foreach ($str in $_.EmailAddresses)
            {
                $mas+=$str.smtpaddress
            }
                                                                   }

    Но на выходе не получаю массив  с  данными.
    Если сообщение было информативным, отметьте его как ответ. И нам приятно и сразу видно ответ на вопрос :-)
    12 сентября 2009 г. 17:56
  • А если так?

    $arr = Get-Mailbox | foreach ($_.EmailAddresses)

    #К сожалению нет под рукой Exchange чтобы протестировать :(


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    12 сентября 2009 г. 17:58
    Модератор
  • Смысл в том, что если

    Get-Mailbox | foreach ($_.EmailAddresses) {
        foreach ($str in $_.EmailAddresses)
            {
                write-host $str.smtpaddress
            }
                                                                   }

    то результат точно такой, как мне нужен:
    USer1@company.ru
    Name.user1@company.ru
    User1@Domain.com

    Но при попытке запихнуть каждый возвращаемый результат в  массив ( $mas+=$str.smtpaddress ), получаю все данные в  одной строке:
    "USer1@company.ruName.user1@company.ruUser1@Domain.com"


    Если сообщение было информативным, отметьте его как ответ. И нам приятно и сразу видно ответ на вопрос :-)
    12 сентября 2009 г. 19:20
  • >Но при попытке запихнуть каждый возвращаемый результат в  массив
    >получаю все данные в  одной строке
    Это потому что вы их не в массив пихаете, а добавляете к строке :) Убедиться в этом можно выполнив $mas -is [array]
    PS D:\temp\test> $str -is [array]
    False
    PS D:\temp\test> $arr -is [array]
    True
    Вы можете в начале сценария объявить переменную как пустой массив, например так: $mas=@()
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    12 сентября 2009 г. 19:26
    Модератор
  • >Но при попытке запихнуть каждый возвращаемый результат в  массив
    >получаю все данные в  одной строке
    Это потому что вы их не в массив пихаете, а добавляете к строке :) Убедиться в этом можно выполнив $mas -is [array]
    PS D:\temp\test> $str -is [array]
    False
    PS D:\temp\test> $arr -is [array]
    True
    Вы можете в начале сценария объявить переменную как пустой массив, например так: $mas=@()
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com

    Сам  только что что понял , что переменная то строкового типа, а не массив. :-[

    Если сообщение было информативным, отметьте его как ответ. И нам приятно и сразу видно ответ на вопрос :-)
    12 сентября 2009 г. 19:29