Когда вы передаете аргумент в функцию, не передавая его по конвейеру, разворачивание коллекций не происходит, например,
function ArgShape($p)
{
$p.GetType().Fullname
$p.Rank
$p.Length
$p[0].GetType().Fullname
}
ArgShape (Get-PSCallstack)
System.Object[]
1
2
System.Management.Automation.CallStackFrame
Также, если вы ожидаете массив для параметра для Pass-Callstack, вы можете указать, чтовот так:
function Pass-Callstack([object[]]$array)
Обратите внимание, что используется «Система».Префикс пространства имен не является обязательным.PowerShell добавит это, если не сможет найти тип.Кроме того, указывать параметр как [объект], по сути, нельзя, поскольку это тип по умолчанию.То есть [object]$arg0
совпадает с $arg0
.
Вы также передаете $ null в Pass-Callstack (хотя и заключенный в массив из одного элемента).Переменная $ psCallStack является закрытой для функции и не видна снаружи, если вы не добавите к ней модификатор, такой как $script:psCallStack
.В общем, я не рекомендую такой подход.Вы должны вывести $ pscallstack из Describe-Callstack следующим образом:
function Describe-Callstack {
Write-Host 'Start Describe-Callstack'
$psCallStack = (Get-PSCallStack)
$psCallStackType = $psCallStack.GetType()
$psCallStackLength = $psCallStack.Length
$psCallStackCommand0 = $psCallStack[0].command
$psCallStackCommand1 = $psCallStack[1].command
Write-Host $psCallStackType
Write-Host $psCallStackLength
Write-Host $psCallStackCommand0
Write-Host $psCallStackCommand1
$psCallStack
}
Затем назначить вывод вызова функции переменной:
$cs = Describe-Callstack
И передать это в Pass-Callstack, например:
Pass-Callstack $cs