2010-09-13 24 views
3

des idées sur la façon dont je peux passer le Get-PSCallStack sans le faire dérouler. Il semble être un system.object [] mais d'après ce que j'ai lu en ligne, ils ne restent pas intacts lorsqu'ils sont passés et se "déroulent". J'ai essayé de placer une virgule devant pour l'empêcher mais cela n'a pas fonctionné.powershell passer system.object [] sans dérouler

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) 

Répondre

6

Lorsque vous transmettez un argument dans une fonction sans le raccorder, il n'y a pas de déroulement des collections, par ex.

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 

Aussi, si vous attendez un tableau pour le paramètre Pass-Callstack vous pouvez spécifier que comme ceci:

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

Notez que l'utilisation du « système ». Le préfixe d'espace de noms est facultatif. PowerShell le préfixera s'il ne trouve pas le type. De plus, spécifier un paramètre comme [objet] est essentiellement un no-op car c'est le type par défaut. C'est [object]$arg0 est le même que $arg0.

Vous transmettez également $ null dans Pass-Callstack (mais enveloppé dans un seul tableau d'éléments). La variable $ psCallStack est privée à la fonction et non visible à l'extérieur, sauf si vous le préfixez avec un modificateur comme $script:psCallStack. En général, je ne recommande pas cette approche. Vous devez sortie PSCallStack de $ de describe-Callstack comme ceci:

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 
} 

puis attribuez-lui la sortie de l'appel de fonction à une variable:

$cs = Describe-Callstack 

Et passer que dans Pass-Callstack par exemple:

Pass-Callstack $cs 
0

Définissez un tableau et placez ce que vous voulez placer dans la parenthèse.

Si null est renvoyé, un tableau de taille 1 est renvoyé et la valeur est vide.

$ x = @ (CallSomeMethodHere)

donc je pense que vous voulez: $ x = @ (PSCallStack $)