У меня возникают трудности с доступом к PSObject
с определенными NoteProperties, которые передаются в удаленный сеанс через Invoke- Команда
. Причина, по которой я создаю объект для этой цели, заключается в том, что мне нужен доступ к двум отдельным частям информации в удаленном сеансе, но 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
}
Я получаю следующий вывод для каждой из пронумерованных строк выше.
$input
Итак, прежде всего я попробовал свою обычную технику вывода переменной на консоль, которая подтвердила, что свойства были переданы с ожидаемым значением:
NoteProperty1 : {some, value}
NoteProperty2 : {some, other, value}
PSComputerName : my-computer
RunspaceId : d1f35c8b-f631-4caa-bae0-f7c0066bbd55
PSShowComputerName : True
$ ввод | 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
начинают вызывать у меня интерес...
$input.NoteProperty1
Повезло с первыми двумя, и я начал проверять NoteProperty1
. Однако значение этого свойства выглядит нулевым; ничего не записывается в консоль с помощью приведенной выше строки, $input.NoteProperty1 -eq $null
возвращает True.
$input.NoteProperty1 | Get-Member
Итак, наконец, я попытался проверить значение NoteProperty1
напрямую через Get-Member
, что с треском провалилось с сообщением «Ни один объект не был указан для командлет get-member.», что согласуется с нулевым объектом, передаваемым Get-Member.
Итак, я сейчас в полной растерянности: это свойство Шредингера и существует, и не существует; оба имеют ожидаемое значение и не имеют значения. Я думаю, что могу написать это немного по-другому, что устранит необходимость в NoteProperties, но я хотел бы знать, что здесь происходит!