2010-09-13 7 views
3

любые идеи о том, как я могу передать Get-PSCallStack без его разворота. Кажется, это system.object [], но из того, что я читал в Интернете, они не остаются неизменными при передаче и «разворачиваются». Я попытался поставить запятую спереди, чтобы предотвратить ее, но это не сработало.powershell pass system.object [] без разворачивания

function Pass-Callstack ([System.Object]$arg0) { 
Write-Host 'Start Pass-Callstack' 
$psCallStack = $arg0 
$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 
$arg0 | gm 
} 

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 | gm 
} 
Describe-Callstack 
Pass-Callstack (,$psCallStack) 

ответ

6

Когда вы передаете аргумент в функцию без его прокладки, в нем нет разворота коллекций, например.

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] по существу нет-op, потому что это тип по умолчанию. То есть [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 
0

Определите массив и поместите то, что вы хотите быть массивом в круглой скобке.

Если возвращается null, возвращается массив размером 1 и значение пустое.

$ х = @ (CallSomeMethodHere)

Так я думаю, что вы хотите: $ х = @ ($ psCallStack)

Смежные вопросы