2015-05-11 4 views
1

Каков правильный способ создания/очистки/инициализации объекта внутри цикла for с помощью следующего метода/синтаксиса? С помощью этого метода увеличивается производительность.Правильный способ создания pscustomobject для добавления в массив

$objComputer = [pscustomobject] @{}

Я заметил, если одна из систем не существует в AD и возвращает ошибку или обнулить информацию от предыдущего ввода/объекта используется в массиве. Например, компьютер-03 действителен, но BLAH (который не является) извлекает из предыдущей записи Computer-03.

function Get-ADComputers ($NameList) { 
$arrayComputer = @(); 
foreach ($line in $NameList.Split("`r`n") | ? { $_ }) { 
    $PCName = $line.Trim() 
    $Computer = (Get-ADComputer -Identity $PCName -Properties *) 
    $objComputer = [pscustomobject] @{ 
     Computer = $PCName 
     Active = $Computer.Enabled 
     Date = $Computer.PasswordLastSet 
     DaysOld = (Get-DaysOld $Computer.PasswordLastSet) 
     OU = $Computer.DistinguishedName 
    } 
    write-host $objComputer 
    $arrayComputer += $objComputer 
    $objComputer = $null; 
} return $arrayComputer 
} 

РЕЗУЛЬТАТЫ

Computer Active Date    DaysOld 
Computer-01 TRUE 4/12/2015 8:16 -29 
Computer-02 TRUE 5/4/2015 7:11 -7 
Computer-03 TRUE 4/20/2015 9:01 -21 
BLAH  TRUE 4/20/2015 9:01 -21 
Computer-03 TRUE 4/6/2015 8:14 -35 
Computer-04 TRUE 5/9/2015 17:17 -1 
Computer-05 TRUE 4/17/2015 12:04 -24 

Спасибо за вашу помощь! :)

EDIT ПРИМЕР С TRY CATCH:

function Get-ADComputers ($NameList) { 
$arrayComputer = @(); 
foreach ($line in $NameList.Split("`r`n") | ? { $_ }) { 
    $Computer = $null 
    $PCName = $line.Trim() 
    try { 
     $Computer = (Get-ADComputer -Identity $PCName -Properties *) 
     $objComputer = [pscustomobject] @{ 
     Computer = $PCName 
     Active = $Computer.Enabled 
     Date = $Computer.PasswordLastSet 
     DaysOld = (Get-DaysOld $Computer.PasswordLastSet) 
     OU = $Computer.DistinguishedName 
     } 
    } catch { 
     $objComputer = [pscustomobject] @{ 
     Computer = "$PCName" 
     Active = "Missing" 
     Date = "N/A" 
     DaysOld = "N/A" 
     OU = "N/A" 
     } 
    } 
    write-host $objComputer 
    $arrayComputer += $objComputer 
    $objComputer = $null; 
} return $arrayComputer 
} 

ответ

3

Если вызов Get-ADComputer терпит неудачу, $Computer не убрались. Вам придется обрабатывать ошибку так или иначе. Простое решение:

$Computer = $null 
$Computer = (Get-ADComputer -Identity $PCName -Properties *) 
if(!$Computer) { #handle a missing computer 
    $objComputer = [pscustomobject] @{ 
     Computer = "Computer not found" 
     Active = "FALSE" 
     Date = "N/A" 
     DaysOld = "N/A" 
     OU = "N/A" 
    } 
} 

Вы также можете использовать блок try/catch. Если вам все равно, вы можете использовать -ErrorAction SilentlyContinue.

+2

Я думаю, что ваше предложение блока Try/Catch - отличное предложение для решения их проблемы. Хотелось бы вам привести пример того, как они могли бы это использовать. – TheMadTechnician

+3

Обратите внимание, что для try/catch для работы вам необходимо сделать ошибку [завершающей ошибкой] (http://blogs.msdn.com/b/powershell/archive/2006/04/25/583241.aspx) ('- ErrorAction Stop' или '$ ErrorActionPreference = 'Stop''). Использование '-ErrorAction SilentlyContinue' имеет смысл только в том случае, если вы хотите скрыть сообщение об ошибке (non-terminating) и продолжить независимо. –

+0

@ TheMadTechnician Я добавил пример try catch ... –

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