Член объекта PowerShell является пустым из C # - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь запустить Get-NetAdapter -Physical из C #.Если я запускаю его из самого PS, то в результирующей таблице есть столбцы InterfaceDescription и MacAddress со значимыми значениями, однако это делается в C #:

using (var ps = PowerShell.Create())
{
    ps.AddCommand("Get-NetAdapter");
    ps.AddParameter("Physical");
    var results = ps.Invoke();
[...error checking here...]
    foreach (var result in results)
    {
[...null check here...]
        var name = result.Members["InterfaceDescription"].Value;
        var mac = result.Members["MacAddress"].Value;
    }
}

Во второй строке в foreach выбрасывается исключение NullReferenceException в левой части.Value.Если я изменю Members на Properties, результат будет таким же.name в порядке.Я также пытался использовать dynamic, чтобы добраться до участников, но это тоже не работает.Как добраться до объекта, который можно получить в PowerShell через thing.MacAddress?

1 Ответ

2 голосов
/ 20 мая 2019

Вы видите это, потому что "MacAddress" является объектом ScriptProperty:

Get-NetAdapter -Physical | Get-Member -Name MacAddress | fl *


TypeName   : Microsoft.Management.Infrastructure.CimInstance#ROOT/StandardCimv2/MSFT_NetAdapter
Name       : MacAddress
MemberType : ScriptProperty
Definition : System.Object MacAddress {get=$out = ""
                       if (($this.NetworkAddresses -ne $null) -and
                           ($this.NetworkAddresses.length -ge 1))
                       {
                         $MacAddress = $this.NetworkAddresses[0];
                       }
                       if($MacAddress -ne $null)
                       {
                           for($i = 0; $i -lt $MacAddress.Length; )
                           {
                               $out += $MacAddress[$i++];
                               if($i -eq $MacAddress.Length)
                               {
                                 break;
                               }
                               $out += $MacAddress[$i++];
                               if ($i -lt $MacAddress.Length)
                               {
                                 $out += '-';
                               }
                           }
                       }
                       $out;set=param($newValue)
                       $MacAddress = $newValue -replace '(:|-)'
                       $this.NetworkAddresses = $MacAddress;}

Как описано в этого ответа , если вы просто перенаправите результаты в Select-Object *, ScriptProperty будет оцениваться в пространстве выполнения PowerShell и вместо этого будет возвращен в виде заметки.

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