У меня есть функция 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
. Я уверен, что я что-то упустил.
Да, я думал, что это сложнее. Я переработал свой код, чтобы использовать более простой подход :-) – MadBoy
Но ради обучения я хотел знать, как правильно использовать ref, где основной объект обновляется, и затем я могу назначить его так, как я хочу. – MadBoy
PSObject - плохой пример того, что он имеет степень персистентности, поэтому этот пример корректирует значение в переменной, содержащей целое число, посредством PSReference. 'code'function one { [Int] $ one = 1; два ([Ref] $ one); $ 1 }; функция 2 ([Ref] $ 2) { $ two.Value = 2 }; –