3

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)
4

2 に答える 2

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]として指定することは、デフォルトのタイプであるため、基本的には何もしません。それは[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 
}

次に、関数呼び出しの出力を変数に割り当てます。

$cs = Describe-Callstack 

そして、それをPass-Callstackに渡します。例:

Pass-Callstack $cs
于 2010-09-13T15:49:33.787 に答える
0

配列を定義し、配列にしたいものを括弧内に配置します。

nullが返された場合、サイズ1の配列が返され、値は空白になります。

$ x = @(CallSomeMethodHere)

だから私はあなたが欲しいと思います:$ x = @($ psCallStack)

于 2012-01-19T17:36:47.057 に答える