Add-Member к объекту странное поведение - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь добавить элемент "canonicalName" к объекту.Когда я использую оператор:

$obj | Add-Member NoteProperty "CanonicalName" 
-value (Get-ADComputer $row.ServerName -Properties CanonicalName).CanonicalName

, столбец «canonicalName» вообще не отображается.Использование оператора с переменной:

    $a = (Get-ADComputer $row.ServerName -Properties CanonicalName).CanonicalName 
$obj | Add-Member NoteProperty "CanonicalName" -value $a 

works perfectly.

Подсказка: некоторые имена серверов, через которые я перебираюсь, больше не находятся в домене.код:

$data = $dataSet.Tables[0] 
$ErrorActionPreference = "silentlycontinue"
$info = @()
foreach($row in $data)
{ 
    $obj = New-Object psobject
    $obj | Add-Member NoteProperty "ServerName" -Value $row.ServerName
    #$a = (Get-ADComputer $row.ServerName -Properties CanonicalName).CanonicalName 
    #$obj | Add-Member NoteProperty "CanonicalName" -value $a 
    $obj | Add-Member NoteProperty "CanonicalName" -value (Get-ADComputer $row.ServerName -Properties CanonicalName).CanonicalName


    $info += $obj    
}

$info | ft -AutoSize

Я ожидаю получить:

ServerName CanonicalName                                                             
---------- -------------                                                             
N3751022   xx.yy.de/Memberserver/SQL-Cluster/xx/n3887022                 
N3732022   xx.zz.de/Memberserver/yy/uu/zz/N3732022 

без переменной $ a все, что я получаю (без столбца canonicalName):

ServerName
----------
N3751022  
N3732022 

Я тестировал код в другом Домене (все Серверы в наборе данных присутствуют в Домене!) Я получаю правильный результат (два столбца serverName и canonicalName), даже если для данного имени нет никакого значения canonicalNameимя_серверы.

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Использование try / catch может стать для вас обходным путем ...

Обратите внимание, что блок захвата, использованный в этом примере, далек от точного. Любое исключение из запуска Get-ADComputer будет обрабатываться одинаково, мы просто предполагаем, что отсутствие вывода Get-ADComputer означает, что компьютер не является членом домена.

$data = $dataSet.Tables[0] 
$ErrorActionPreference = "silentlycontinue"
$info = @()
foreach($row in $data)
{ 
    $obj = New-Object psobject
    $obj | Add-Member NoteProperty "ServerName" -Value $row.ServerName
    try {
            $obj | Add-Member NoteProperty "CanonicalName" -Value (Get-ADComputer $row.ServerName -Properties CanonicalName).CanonicalName
    } catch {
            $obj | Add-Member NoteProperty "CanonicalName" -Value $null
    }

    $info += $obj    
}

$info | ft -AutoSize
0 голосов
/ 09 мая 2019

Вот как бы я это сделал.Использование фильтра на Get-ADComputer позволит ему вернуть ноль, если нет соответствующей записи вместо ошибки:

$data = $dataSet.Tables[0] 
$ErrorActionPreference = "silentlycontinue"
$info = @()

foreach ($Row in $Data) {
    $ServerName =  $Row.ServerName
    $obj = New-Object psobject
    $obj | Add-Member NoteProperty "ServerName" -Value $ServerName
    $CanonicalName = (Get-ADComputer -Filter {Name -like $ServerName} -Properties CanonicalName).CanonicalName
    if ($CanonicalName) {
        $obj | Add-Member NoteProperty "CanonicalName" -value $CanonicalName
    }
    else {
        $obj | Add-Member NoteProperty "CanonicalName" -value $null
    }
    $info += $obj 
}

$info | ft -AutoSize
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...