У меня есть файл скрипта, содержащий приведенный ниже код.
Он запускает один и тот же код 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 свойства.
Таким образом, я ожидаю получить в выходном потоке таблицу с двумя столбцами.
Вместо этого я не получаю никакого вывода.
В этом смысле это на самом деле не дублирующий вопрос, но он точно связан.
.getType()
, но при вводе$myArray.getType()
в командной строке отладки я получаю вывод. Я не могу понять это. - person Bjorn Mistiaen   schedule 10.01.2017$myArray
, и вы сможете увидеть, работает ли$myArray.GetType()
в консоли во время отладки. Таким образом, у вас есть лучшие варианты устранения неполадок. - person briantist   schedule 10.01.2017$myArray
содержит данные. Моя проблема в том, что$myArray.getType()
не выводит никаких результатов при вызове в скрипте. Я не знаю, почему это так. - person Bjorn Mistiaen   schedule 10.01.2017$myArray
отображается как таблица с 2 столбцамиkey
иval
, тогда как$myArray.GetType()
будет отображать табличный вывод с 4 столбцамиIsPublic
,IsSerial
,Name
иBaseType
. Поскольку ни один из последних столбцов не имеет заголовкаkey
илиval
, ни один из них не отображается. - person Ansgar Wiechers   schedule 11.01.2017