Может ли кто-нибудь объяснить это странное поведение PSObject + add-member для Powershell? - PullRequest
3 голосов
/ 21 апреля 2011

Я просто не понимаю, почему это происходит. Если я создам два отдельных новых объекта PSO, они, похоже, влияют друг на друга. Например, с этим кодом:

$o1 = new-object psobject
$o1 | add-member noteproperty abc 123

$o2 = new-object psobject
$o2 | add-member noteproperty def 456

write-output $o1
write-output $o2

Я ожидаю увидеть выходные данные как для abc, так и для def, но я получаю только abc:

abc
---
123

Если я вместо этого использую write-host, вот так:

write-host $o1
write-host $o2

Тогда он показывает вывод так:

@{abc=123}
@{def=456}

Итак, согласно выводу записи, $ o2 пусто / пусто, но хост записи говорит, что это ложь.

Что происходит?

Ответы [ 3 ]

5 голосов
/ 22 апреля 2011

Если вы выводите несколько различных объектов в сценарии, столбцы, которые выводятся, зависят от первого элемента в конвейере. Поскольку первый PSObject имел только свойство abc, второй объект ничего не выводил, поскольку у него не было соответствующего свойства.

P.S. Вы не увидите такого поведения, если будете выполнять его по одной строке за раз.

5 голосов
/ 22 апреля 2011

Если вы запустите образцы строк из консоли, вы не увидите никаких проблем. Если вы запустите их все в сценарии, вы увидите проблему. Это связано с тем, что Out-Default (который находится в конце каждого конвейера) основывает свои решения о форматировании на первом объекте, который он видит. Поэтому вам нужно убедиться, что вы не выводите более одного типа объекта. Или, если это так, вам нужно создать некоторые правила форматирования, которые будут обрабатывать все типы объектов (например, что делается для вывода каталогов и файлов из Get-ChildItem).

1 голос
/ 21 апреля 2011

Я не могу воспроизвести проблему, с которой вы столкнулись, но я заметил, что форматированный вывод записи-вывода показывает объект в дальнем правом углу консоли.Я действительно пропустил это в первый раз, когда я увидел это.Если я передаю его в format-list, я получаю следующее.

39 >  $o1 = new-object psobject
40 >  $o1 | add-member noteproperty abc 123
41 >  $o2 = new-object psobject
42 >  $o2 | add-member noteproperty def 456
43 >
43 >  write-output $o1 | fl

abc : 123

44 >  write-output $o2 | fl

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