Нет вывода во время выполнения скрипта или функции. Вывод только в командной строке

У меня есть файл скрипта, содержащий приведенный ниже код.
Он запускает один и тот же код 3 раза.

  1. В скрипте внутри функции
  2. В скрипте вне функции
  3. Вне сценария, в командной строке

Исходный код:

Clear-Host

$myKeys = @('key1','key2','key3','key4','key5')
$myValues = @('one','two','three','four','five')

# Declare function
Function Invoke-MyArray
{
    [CmdletBinding()]   param ()

    Write-Output "Function: $($MyInvocation.Mycommand)"

    $myLocalArray = @()

    foreach ($element in $myKeys)
    {
        $key = $element
        $val = $myValues[$myKeys.IndexOf($key)]

        $myObject = New-Object -TypeName PSObject -Property @{
            key = $key
            val = $val
        }   

        $myLocalArray += $myObject
    }

    Write-Output '### 1 ### $myArray'
    Write-Output '------------------'
    $myArray

    Write-Output '### 2 ### $myArray.getType()'
    Write-Output '----------------------------'
    $myArray.getType()

    Write-Output '### 3 ### $myArray.getType() | Out-String'
    Write-Output '-----------------------------------------'
    $myArray.getType() | Out-String



    Write-Output '### 4 ### $myArray[0]'
    Write-Output '---------------------'
    $myArray[0]

    Write-Output '### 5 ### $myArray[0].getType()'
    Write-Output '-------------------------------'
    $myArray[0].getType()

    Write-Output '### 6 ### $myArray[0].getType() | Out-String'
    Write-Output '--------------------------------------------'
    $myArray[0].getType() | Out-String

}

# Call function
Write-Output '====================='
Write-Output '=== Call function ==='
Write-Output '====================='
Invoke-MyArray

Write-Output '==============================================='
Write-Output '=== Execute same code, without the function ==='
Write-Output '==============================================='
# Execute same code, without the function
$myArray = @()

foreach ($element in $myKeys)
{
    $key = $element
    $val = $myValues[$myKeys.IndexOf($key)]

    $myObject = New-Object -TypeName PSObject -Property @{
        key = $key
        val = $val
    }   

    $myArray += $myObject
}


Write-Output '### 1 ### $myArray'
Write-Output '------------------'
$myArray

Write-Output '### 2 ### $myArray.getType()'
Write-Output '----------------------------'
$myArray.getType()

Write-Output '### 3 ### $myArray.getType() | Out-String'
Write-Output '-----------------------------------------'
$myArray.getType() | Out-String



Write-Output '### 4 ### $myArray[0]'
Write-Output '---------------------'
$myArray[0]

Write-Output '### 5 ### $myArray[0].getType()'
Write-Output '-------------------------------'
$myArray[0].getType()

Write-Output '### 6 ### $myArray[0].getType() | Out-String'
Write-Output '--------------------------------------------'
$myArray[0].getType() | Out-String


Write-Output '===================================='
Write-Output '=== Executed on the command line ==='
Write-Output '===================================='

Результирующий вывод:

=====================
=== Call function ===
=====================
Function: Invoke-MyArray
### 1 ### $myArray
------------------

key  val  
---  ---  
key1 one  
key2 two  
key3 three
key4 four 
key5 five 
### 2 ### $myArray.getType()
----------------------------

### 3 ### $myArray.getType() | Out-String
-----------------------------------------

IsPublic IsSerial Name                                     BaseType                                                                               
-------- -------- ----                                     --------                                                                               
True     True     Object[]                                 System.Array                                                                           



### 4 ### $myArray[0]
---------------------
key1 one  
### 5 ### $myArray[0].getType()
-------------------------------

### 6 ### $myArray[0].getType() | Out-String
--------------------------------------------

IsPublic IsSerial Name                                     BaseType                                                                               
-------- -------- ----                                     --------                                                                               
True     False    PSCustomObject                           System.Object                                                                          



===============================================
=== Execute same code, without the function ===
===============================================
### 1 ### $myArray
------------------
key1 one  
key2 two  
key3 three
key4 four 
key5 five 
### 2 ### $myArray.getType()
----------------------------

### 3 ### $myArray.getType() | Out-String
-----------------------------------------

IsPublic IsSerial Name                                     BaseType                                                                               
-------- -------- ----                                     --------                                                                               
True     True     Object[]                                 System.Array                                                                           



### 4 ### $myArray[0]
---------------------
key1 one  
### 5 ### $myArray[0].getType()
-------------------------------

### 6 ### $myArray[0].getType() | Out-String
--------------------------------------------

IsPublic IsSerial Name                                     BaseType                                                                               
-------- -------- ----                                     --------                                                                               
True     False    PSCustomObject                           System.Object                                                                          



====================================
=== Executed on the command line ===
====================================


PS C:\>     Write-Output '### 1 ### $myArray'
    Write-Output '------------------'

### 1 ### $myArray
------------------
PS C:\> $myArray

key  val  
---  ---  
key1 one  
key2 two  
key3 three
key4 four 
key5 five 


PS C:\>     Write-Output '### 2 ### $myArray.getType()'
    Write-Output '----------------------------'

### 2 ### $myArray.getType()
----------------------------
PS C:\> $myArray.getType()

IsPublic IsSerial Name                                     BaseType                                                                               
-------- -------- ----                                     --------                                                                               
True     True     Object[]                                 System.Array                                                                           


PS C:\>     Write-Output '### 3 ### $myArray.getType() | Out-String'
    Write-Output '-----------------------------------------'

### 3 ### $myArray.getType() | Out-String
-----------------------------------------
PS C:\> $myArray.getType() | Out-String

IsPublic IsSerial Name                                     BaseType                                                                               
-------- -------- ----                                     --------                                                                               
True     True     Object[]                                 System.Array                                                                           



PS C:\>     Write-Output '### 4 ### $myArray[0]'
    Write-Output '---------------------'

### 4 ### $myArray[0]
---------------------
PS C:\>     $myArray[0]


key  val
---  ---
key1 one


PS C:\>     Write-Output '### 5 ### $myArray[0].getType()'
    Write-Output '-------------------------------'

### 5 ### $myArray[0].getType()
-------------------------------
PS C:\>     $myArray[0].getType()


IsPublic IsSerial Name                                     BaseType                                                                               
-------- -------- ----                                     --------                                                                               
True     False    PSCustomObject                           System.Object                                                                          


PS C:\>     Write-Output '### 6 ### $myArray[0].getType() | Out-String'
    Write-Output '--------------------------------------------'

### 6 ### $myArray[0].getType() | Out-String
--------------------------------------------
PS C:\>     $myArray[0].getType() | Out-String


IsPublic IsSerial Name                                     BaseType                                                                               
-------- -------- ----                                     --------                                                                               
True     False    PSCustomObject                           System.Object                                                                          


PS C:\> 

Обратите внимание, что вызов .getType() всегда пуст (без результата), за исключением случаев, когда он вызывается непосредственно из командной строки.

Только когда .getType() передается в Out-String, мы видим, что результат печатается внутри скрипта.

Почему я не могу получить вывод внутри моего скрипта и/или функции только с .getType()?

EDIT (после того, как Ансгар Вихерс пометил как дубликат):
Multiple-commands-use-select-object-within">duplicate содержит ссылка на статью MSDN, в которой говорится:

Теперь, если нет зарегистрированного представления для типа данных, Out-Default просматривает ПЕРВЫЙ ОБЪЕКТ В ПОТОКЕ, чтобы определить, сколько свойств у объекта 5 или более свойств, и отправляет ВЕСЬ ПОТОК в Format-List. , в противном случае он отправляет ВЕСЬ ПОТОК в Format-Table. Когда он отправляет поток в Format-Table, эта команда должна генерировать столбцы. Он делает это, просматривая свойства ПЕРВОГО ОБЪЕКТА — они становятся столбцами. Если у первого объекта есть 2 свойства, вы получите таблицу из 2 столбцов, даже если все остальные объекты в потоке имеют 10 свойств.

$myArray — это массив с объектами, имеющими 2 свойства.
Таким образом, я ожидаю получить в выходном потоке таблицу с двумя столбцами.
Вместо этого я не получаю никакого вывода.
В этом смысле это на самом деле не дублирующий вопрос, но он точно связан.


person Bjorn Mistiaen    schedule 10.01.2017    source источник
comment
Вы прошли через это в отладчике?   -  person briantist    schedule 10.01.2017
comment
Да, тот же результат. Нет вывода при выполнении строки .getType(), но при вводе $myArray.getType() в командной строке отладки я получаю вывод. Я не могу понять это.   -  person Bjorn Mistiaen    schedule 10.01.2017
comment
Я хочу сказать, что если вы нажмете точку останова, вы сможете увидеть значения переменных в области видимости функции, так что вы сможете увидеть, что на самом деле содержит $myArray, и вы сможете увидеть, работает ли $myArray.GetType() в консоли во время отладки. Таким образом, у вас есть лучшие варианты устранения неполадок.   -  person briantist    schedule 10.01.2017
comment
Не уверен, что вы имеете в виду. Я отладил его и увидел, что $myArray содержит данные. Моя проблема в том, что $myArray.getType() не выводит никаких результатов при вызове в скрипте. Я не знаю, почему это так.   -  person Bjorn Mistiaen    schedule 10.01.2017
comment
У вас та же проблема с форматированием, что и у человека, задающего другой вопрос (см. ссылку вверху вашего вопроса). Джеффри Сновер объяснил поведение здесь.   -  person Ansgar Wiechers    schedule 10.01.2017
comment
@AnsgarWiechers Не могли бы вы снова открыть этот вопрос? См. мое редактирование для объяснения, почему оно отличается от вашего дубликата.   -  person Bjorn Mistiaen    schedule 11.01.2017
comment
Это все еще дубликат. Важно не только количество колонок, но и их название. $myArray отображается как таблица с 2 столбцами key и val, тогда как $myArray.GetType() будет отображать табличный вывод с 4 столбцами IsPublic, IsSerial, Name и BaseType. Поскольку ни один из последних столбцов не имеет заголовка key или val, ни один из них не отображается.   -  person Ansgar Wiechers    schedule 11.01.2017
comment
@AnsgarWiechers Ах да, действительно. Ты прав. Я получаю это сейчас. Спасибо за дополнительное разъяснение.   -  person Bjorn Mistiaen    schedule 11.01.2017