powershell pass system.object [] без развертывания - PullRequest
3 голосов
/ 13 сентября 2010

любые идеи о том, как я могу передать Get-PSCallStack без его развертывания. Похоже, что это 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)

Ответы [ 2 ]

6 голосов
/ 13 сентября 2010

Когда вы передаете аргумент в функцию, не передавая его по конвейеру, разворачивание коллекций не происходит, например,

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
0 голосов
/ 19 января 2012

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

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

$ x = @ (CallSomeMethodHere)

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

...