powershell传递system.object []而不展开

alp*_*dev 3 powershell argument-passing

关于我如何能够通过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)
Run Code Online (Sandbox Code Playgroud)

Kei*_*ill 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
Run Code Online (Sandbox Code Playgroud)

此外,如果您希望参数的数组为Pass-Callstack,您可以像这样指定:

function Pass-Callstack([object[]]$array)
Run Code Online (Sandbox Code Playgroud)

注意使用"系统".名称空间前缀是可选的 如果找不到类型,PowerShell将会添加前缀.此外,将参数指定为[object]本质上是一个无操作,因为这是默认类型.那就是[object]$arg0一样的$arg0.

您还将$ null传入Pass-Callstack(尽管包含在单个元素数组中).变量$ psCallStack对函数是私有的,除了你用它之类的修饰符作为前缀之外,它在它之外是不可见的$script:psCallStack.一般来说,我不推荐这种方法.您应该从Describe-Callstack输出$ 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 
}
Run Code Online (Sandbox Code Playgroud)

然后将函数调用的输出分配给变量:

$cs = Describe-Callstack 
Run Code Online (Sandbox Code Playgroud)

并将其传递给Pass-Callstack,例如:

Pass-Callstack $cs
Run Code Online (Sandbox Code Playgroud)