2016-08-02 2 views
0

У меня есть функция DoWork, которая создает объект и сохраняет его в переменной $AllMailboxes. Тогда в рамках этой функции я выполнить другую функцию ProcessEmail, который предполагается принять $Mailbox из $AllMailboxes и переменной, реф, добавить пару полей к нему и либо обновить $AllMailboxes или создать новый $collection, который затем хранит все $ Папку с обновленными полямиИспользование ref в powershell для возврата значений из функции

$collection = @() 

function DoWork() { 
    Get-User -ResultSize Unlimited | Where { $_.RecipientType -eq 'UserMailbox' } | ForEach { $Users = @{} } { $Users[$_.SamAccountName] = $_ } 
    $AllMailboxes = Get-Mailbox -ResultSize Unlimited | Where { $_.RecipientTypeDetails -eq "UserMailbox" } | ForEach { 
    $PrimarySmtpDomain = $_.PrimarySmtpAddress.split("@") 

    New-Object psobject | 
     Add-Member -PassThru NoteProperty Alias $_.Alias | 
     Add-Member -PassThru NoteProperty Name $_.Name |   
     Add-Member -PassThru NoteProperty DisplayName $_.DisplayName 
     Add-Member -PassThru NoteProperty .... other values 
    foreach ($mailbox in $allmailboxes) { 
     $FullEmail = "somestring" 
     ProcessEmail ([ref] $Mailbox) ($FullEmail) 
    } 
    $collection | ft # doesn't display anything 


} 

function ProcessEmail ([ref] $Mailbox, $FullEmail) { 
    $RequireAdd = $true 
    $addresses = $Mailbox.EmailAddresses 
    foreach ($address in $addresses) { 
     if ($address -imatch "sip:") { continue } 
     if ($address -ireplace("smtp:","") -ieq $FullEmail) { 
      $requireAdd = $false 
      break 
    } 

    $Mailbox | Add-Member -MemberType NoteProperty -Name NewEmailToAdd -Value $FullEmail 
    $Mailbox | Add-Member -MemberType NoteProperty -Name NewEmailRequiresAdding -Value $RequireAdd 
    $Mailbox.NewEmailToAdd # displays correctly 
    $Mailbox.NewEmailRequiresAdding #display correctly 
    $collection += $Mailbox 
} 

Я пробовал несколько утверждений с ref, без ссылок, создавая отдельные переменные, но по какой-то причине я не могу заставить его отображать что-либо в $ collection или другими способами, не включенными в функцию ProcessEmail. Я уверен, что я что-то упустил.

ответ

1

Вы делаете его более сложным путем использования PSReference (который нужно будет вам получить доступ к свойству значения). Вам пока не нужно здесь.

Также не нужно использовать эту глобальную/скриптовую переменную, за исключением, возможно, как назначения из DoWork, как показано в этом макете.

function DoWork { 
    foreach ($i in (1..100)) { 
     $psObject = [PSCustomObject]@{ 
      Property1 = 1 
      Property2 = 2 
     } 

     ProcessEmail -Mailbox $psObject -FullEmail $FullEmail 

     $psObject 
    } 
} 

function ProcessEmail { 
    param(
     $Mailbox, 
    ) 

    $Mailbox | Add-Member NewProperty1 "one" 
    $Mailbox | Add-Member NewProperty2 "two" 
} 

$collection = DoWork 

Chris

+0

Да, я думал, что это сложнее. Я переработал свой код, чтобы использовать более простой подход :-) – MadBoy

+0

Но ради обучения я хотел знать, как правильно использовать ref, где основной объект обновляется, и затем я могу назначить его так, как я хочу. – MadBoy

+0

PSObject - плохой пример того, что он имеет степень персистентности, поэтому этот пример корректирует значение в переменной, содержащей целое число, посредством PSReference. 'code'function one { [Int] $ one = 1; два ([Ref] $ one); $ 1 }; функция 2 ([Ref] $ 2) { $ two.Value = 2 }; –

1

Похоже, что вам не хватает области. Измените его, по крайней мере, области скрипта, например:

$script:collection = @() 
$script:collection += $Mailbox 
+0

Кажется, что он работает лучше, но он показывает только 2 поля, которые я добавил в процессе электронной почты, и не показывает все остальные, которые были частью $ Mailbox раньше? Также, может быть, я должен передать $ collection по ref? Какой лучший подход к этому? – MadBoy

+0

Кажется, новые поля были добавлены, но все поля почтового ящика теперь хранятся внутри значения. @ {Alias ​​= weronika.palowska; Имя = Weronika Palowska ;. Таким образом, $ Mailbox имеет 3 поля, 2 новых и все остальные поля в пределах значения .. что будет правильным способом для расширения полей, чтобы добавить еще 2 поля – MadBoy

+0

$ Почтовый ящик | Add-Member -MemberType NoteProperty -Name NewEmailToAdd -Value $ FullEmail - это, похоже, не добавляет еще одно поле – MadBoy

0

я на самом деле решил пойти

function ProcessEmail ($Mailbox, $FullEmail) { 
    $RequireAdd = $true 
    $addresses = $Mailbox.EmailAddresses 
    foreach ($address in $addresses) { 
     if ($address -imatch "sip:") { continue } 
     if ($address -ireplace("smtp:","") -ieq $FullEmail) { 
      $requireAdd = $false 
      break 
     } 
    } 
    $Mailbox | Add-Member -MemberType NoteProperty -Name NewEmailToAdd -Value $FullEmail 
    $Mailbox | Add-Member -MemberType NoteProperty -Name NewEmailRequiresAdding -Value $RequireAdd 
    return ,$mailbox 
}  

И просто ехать:

$Mailbox = ProcessEmail ($Mailbox) ($FullEmail) 
$collection += $Mailbox 

Кажется работать нормально.

Смежные вопросы