2010-09-13 34 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 

另外,如果你期待一個數組的參數傳遞調用堆棧,您可以指定像這樣:

function Pass-Callstack([object[]]$array) 

注意的是,使用的「系統」。名稱空間前綴是可選的。如果找不到類型,PowerShell會預先安排。另外,指定一個參數作爲[object]本質上是一個no-op,因爲這是默認的類型。即[object]$arg0$arg0相同。

您還將$ null傳遞給Pass-Callstack(雖然包裹在單個元素數組中)。變量$ psCallStack是該函數的私有內容,除非您在$script:psCallStack之前添加修飾符。一般來說,我不推薦這種方法。從描述,調用堆棧,你應該輸出$ pscallstack像這樣:

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 $cs 
0

定義一個數組,並將您想要的數組放在括號內。

如果返回null,則返回大小爲1的數組,並且該值爲空。

$ X = @(CallSomeMethodHere)

所以,我想你會想: $ X = @($ psCallStack)

相關問題