none
как построить зависимости между 2 колонками в csv файле RRS feed

  • Вопрос

  • Добрый день,

    Есть csv файл с 2 полями:

    1е поле : "Path"

    2e поле: "Owner"

    Выглядит примерно так:

    Path                  Owner

    PF\Folder1        user1

    PF\Folder2        user1 user2

    PF\Folder3        user2

    Файл был создан скриптом с целью помочь мигрировать Public Folders с Exchange 2003 на Exchange 2010. Основываясь на этом фале скрипт должен отправить емейлы пользователям, отвественным за конкретный PF, с целью пересмотреть его содержимое и, при необхожимости, удалить. Очень многие PF имеют около 100 подпапок и для них всех Owner может быть один и тот же. Также один и тот же Owner может отвечать ра несколько разных PF.

    Подскажиет пожалуйста, как реализовать функцию проверки зависимости между полем Path и полем Owner. Тоесть, чтобы для user1 отправить письмо, что ему надо просмотреть фолдеры  PF\Folder1 и PF\Folder2, а для user2, что ему надо просмотреть фолдеры  PF\Folder2 и PF\Folder3.

    Заранее спасибо.


    16 ноября 2012 г. 16:56

Ответы

  • 1)  Можно использовать match

    $f = Import-CSV u.csv
    $f -match "user1" | Foreach {$_.Path}
    PF\Folder1
    PF\Folder2

    2) C Where-Object

    $f = Import-CSV u.csv
    $f | Where {$_.Owner -like "*user1*"} | Foreach {$_.Path}
    PF\Folder1
    PF\Folder2

    3) Можно использовать hashtable

    $users = @{}
    Import-Csv u.csv | Foreach {
    	$us = @($_.Owner.Split(" "))
    	foreach ($u in $us)
    	{
    		$users[$u] += ,$_.Path
    	}
    }
    
    PS >  $users
    
    Name                           Value
    ----                           -----
    user2                          {PF\Folder2, PF\Folder3}
    user1                          {PF\Folder1, PF\Folder2}
    
    
    PS >  $users["user1"]
    PF\Folder1
    PF\Folder2
    PS >  $users["user2"]
    PF\Folder2
    PF\Folder3

    Ps. Способов много
    • Помечено в качестве ответа Oleh Tserkovnyuk 19 ноября 2012 г. 15:37
    17 ноября 2012 г. 8:11
    Отвечающий

Все ответы

  • 1)  Можно использовать match

    $f = Import-CSV u.csv
    $f -match "user1" | Foreach {$_.Path}
    PF\Folder1
    PF\Folder2

    2) C Where-Object

    $f = Import-CSV u.csv
    $f | Where {$_.Owner -like "*user1*"} | Foreach {$_.Path}
    PF\Folder1
    PF\Folder2

    3) Можно использовать hashtable

    $users = @{}
    Import-Csv u.csv | Foreach {
    	$us = @($_.Owner.Split(" "))
    	foreach ($u in $us)
    	{
    		$users[$u] += ,$_.Path
    	}
    }
    
    PS >  $users
    
    Name                           Value
    ----                           -----
    user2                          {PF\Folder2, PF\Folder3}
    user1                          {PF\Folder1, PF\Folder2}
    
    
    PS >  $users["user1"]
    PF\Folder1
    PF\Folder2
    PS >  $users["user2"]
    PF\Folder2
    PF\Folder3

    Ps. Способов много
    • Помечено в качестве ответа Oleh Tserkovnyuk 19 ноября 2012 г. 15:37
    17 ноября 2012 г. 8:11
    Отвечающий
  • Большое спасибо за помощь, hashtable - это то что мне надо. Правда теперь столкнулся с другой проблемой, не могу вывести, всю информацию, что мне нужна т.к. всё не помещается в окно вывода. Для пользователей у которых много паблик фолдеров, вывод выглядит так:

    Name                           Value                                                                                                       
    ----                           -----                                                                                                       
    companу\user1         {/Engineering Information Exchange/350, /Engineering Information Exchange/400, /Engineering Information E...

    Пробовал отфарматировать вывод такой командой: $owners | ft -wrap Name, Value -AutoSize , получилось так:

    Name                               Value                                                                                                                    
    ----                                   -----                                                                                                                    
    companу\user1   {/Engineering Information Exchange/350, /Engineering Information Exchange/400, /Engineering Information Exchange/400, /En
                      gineering Information Exchange/400...}

    Поместилось немного больше, но явно не всё. Конечная цель, - сформировать емейл каждому пользователю со списком папок, получить полный список папок критично.

    • Помечено в качестве ответа Oleh Tserkovnyuk 19 ноября 2012 г. 15:36
    • Снята пометка об ответе Oleh Tserkovnyuk 19 ноября 2012 г. 15:37
    19 ноября 2012 г. 11:29
  • Большое спасибо за помощь, hashtable - это то что мне надо. Правда теперь столкнулся с другой проблемой, не могу вывести, всю информацию, что мне нужна т.к. всё не помещается в окно вывода. Для пользователей у которых много паблик фолдеров, вывод выглядит так:

    Name                           Value                                                                                                       
    ----                           -----                                                                                                       
    companу\user1         {/Engineering Information Exchange/350, /Engineering Information Exchange/400, /Engineering Information E...

    Пробовал отфарматировать вывод такой командой: $owners | ft -wrap Name, Value -AutoSize , получилось так:

    Name                               Value                                                                                                                    
    ----                                   -----                                                                                                                    
    companу\user1   {/Engineering Information Exchange/350, /Engineering Information Exchange/400, /Engineering Information Exchange/400, /En
                      gineering Information Exchange/400...}

    Поместилось немного больше, но явно не всё. Конечная цель, - сформировать емейл каждому пользователю со списком папок, получить полный список папок критично.

    Какой смысл использовать FT?

    foreach($i in $h.GetEnumerator()) {
    	Send-MailMessage -To $i.Name -From xxx@xxx.com -Subject Folder -Body ($i.Value | Out-String)
    }

    Для полного вывода:

    $FormatEnumerationLimit = -1
    $owners | ft -wrap -auto

    • Изменено KazunEditor 19 ноября 2012 г. 11:56
    19 ноября 2012 г. 11:53
    Отвечающий
  • Ещё раз большое спасибо. Вы мне очень помогли.
    19 ноября 2012 г. 15:37