4

PowerShellで試してみたところ、一部のテスト再帰関数で呼び出しの深さが1000に設定されているというエラーが発生しました。インターネットでいくつかの情報を調べたところ、これはPowerShellでのエラー処理が原因であることがわかりました(正しく理解できた場合)。

再帰の深さの制限はバージョン1で修正されています。深い再帰は、例外の処理方法が原因で、64ビットモードで問題を引き起こしていました。カスケードのメモリ不足エラーが発生していました。最終的な結果として、スクリプトがすべてのプラットフォームに移植可能になるように、すべてのプラットフォームで再帰の深さを厳しく制限しました。--PowerShellの共同設計者であるBrucePayette

ここで見つけました。

また、MSDNで、この制限は構成可能であると述べているこの例外ページを見つけました(ただし、これを行う方法については何も見つかりませんでした)-ここの備考セクションを参照してください。

この制限はどのように設定できますか?

4

1 に答える 1

4
  • PowerShell V1では、最大呼び出し深度は100です。

.NET Reflectorを使用すると、このスニペットでSystem.Management.ExecutionContextクラスコードから次のことがわかります。

internal int IncrementScopeDepth()
{
    using (IDisposable disposable = tracer.TraceMethod("{0}", new object[] { this.scopeDepth }))
    {
        if (this.CurrentPipelineStopping)
        {
            throw new PipelineStoppedException();
        }
        this.scopeDepth++;
        if (this.scopeDepth > 100)
        {
            ScriptCallDepthException exceptionRecord = new
            ScriptCallDepthException(this.scopeDepth, 100);
            tracer.TraceException(exceptionRecord);
            throw exceptionRecord;
        }
        return this.scopeDepth;
    }
}

ハードコードされた100を変更することはできません。

  • PowerShell V2では、最大呼び出し深度は1000です。

繰り返しますが、コードを見ると、デフォルトの最大呼び出し深度を回避する方法はないようです。

  • PowerShell V3(CTP)では、最大の呼び出し深度はないようです(もちろんリソースが不足している場合を除く)。この動作は接続時のバグとして説明されているため、最終バージョンで変更される可能性があります。
于 2012-06-02T15:16:22.430 に答える