Как получить доступ к NoteProperties на InputObject для сеанса удаленного взаимодействия - PullRequest
5 голосов
/ 19 марта 2012

У меня проблемы с доступом к PSObject с определенными NoteProperties, которые передаются в удаленный сеанс через Invoke-Command.Причина, по которой я создаю объект для этой цели, заключается в том, что мне нужен доступ к двум отдельным частям информации в удаленном сеансе, но PowerShell предоставляет только один InputObject.

Мой код выглядит примерно так:

$sessionInput = new-object -TypeName System.Object
$sessionInput | Add-Member -MemberType NoteProperty -Name NoteProperty1 -Value @("some", "value")
$sessionInput | Add-Member -MemberType NoteProperty -Name NoteProperty2 -Value @("some", "other", "value)
$session = New-PSSession -ComputerName my-computer -Credential (Get-Credential)
Invoke-Command -Session $session -InputObject $sessionInput {
    $input #1
    $input | Get-Member #2
    $input.NoteProperty1 #3
    $input.NoteProperty1 | Get-Member #4
}

Я получаю следующий вывод для каждой из пронумерованных строк выше.

1.$input

Итак, сначала я попробовал свой обычный метод вывода переменной на консоль, который подтвердил, что свойства были переданы с ожидаемым значением:

NoteProperty1      : {some, value}
NoteProperty2      : {some, other, value}
PSComputerName     : my-computer
RunspaceId         : d1f35c8b-f631-4caa-bae0-f7c0066bbd55
PSShowComputerName : True

2,$input | Get-Member

Это сгенерировало немного больше информации, чем предыдущая попытка:

   TypeName: Deserialized.System.Object

WARNING: column "PSComputerName" does not fit into the display and was removed.

Name          MemberType   Definition                                                                                       
----          ----------   ----------                                                                                       
Equals        Method       bool Equals(System.Object obj)                                                                   
GetHashCode   Method       int GetHashCode()                                                                                
GetType       Method       type GetType()                                                                                   
ToString      Method       string ToString(), string ToString(string format, System.IFormatProvider formatProvider)         
NoteProperty1 NoteProperty Deserialized.System.String[] NoteProperty1=some val...
NoteProperty2 NoteProperty Deserialized.System.String[] NoteProperty2=some oth...

Обратите внимание, что две последние строки ясно показывают, что NoteProperty присутствует на объекте, полученном удаленным сеансом.Все эти упоминания о Deserialized начинают вызывать у меня интерес ...

3.$input.NoteProperty1

Повезло с первыми двумя, я начал пытаться осмотреть NoteProperty1 сам.Однако значение этого свойства, по-видимому, равно нулю;ничего не записывается в консоль, используя строку выше, $input.NoteProperty1 -eq $null возвращает True.

4.$input.NoteProperty1 | Get-Member

Итак, наконец, я попытался проверить значение NoteProperty1 напрямую через Get-Member, что с треском провалилось с сообщением «В командлете get-member не указан объект»., что соответствует нулевому объекту, передаваемому в Get-Member.

Help!

Итак, теперь я в полном недоумении: это свойство Шредингера существует и не существует;оба имеют ожидаемое значение и не имеют значения.Я думаю, что могу написать это немного по-другому, что устранит необходимость в NoteProperties, но я бы хотел знать, что здесь происходит!

1 Ответ

8 голосов
/ 20 марта 2012

Выберите объект для победы!:)

$SessionInput = New-Object -TypeName System.Object
$SessionInput | Add-Member -MemberType NoteProperty -Name NoteProperty1 -Value @("some", "value")
$SessionInput | Add-Member -MemberType NoteProperty -Name NoteProperty2 -Value @("some", "other", "value")
$Session = New-PSSession -ComputerName 127.0.0.1
Invoke-Command -Session $Session -InputObject $SessionInput {
    [array]$NoteProperty1 = $Input | Select -Expand NoteProperty1
    for ($i = 0; $i -lt $NoteProperty1.Count; $i ++)
    {
        Write-Host -ForeGroundColor "Magenta" $i
        $NoteProperty1[$i]
    }
}

Для строковых переменных вам все равно нужно расширить строку в операторе выбора следующим образом:

$SessionInput = New-Object -TypeName System.Object
$SessionInput | Add-Member -MemberType NoteProperty -Name NoteProperty1 -Value "SomeValue"
$Session = New-PSSession -ComputerName 127.0.0.1
Invoke-Command -Session $Session -InputObject $SessionInput {
    $NoteProperty1 = $Input | Select -Expand NoteProperty1
    $NoteProperty1
}
...