4

我只是在 PowerShell 中尝试,并在某些测试递归函数中收到关于调用深度设置为 1000 的错误。我在网上查找了一些资料,发现这是由于 PowerShell 中的错误处理造成的(如果我没记错的话):

递归深度限制在版本 1 中已修复。由于处理异常的方式,深度递归在 64 位模式下会导致问题。它导致级联的内存不足错误。最终结果是我们硬限制了所有平台上的递归深度,以帮助确保脚本可以移植到所有平台。- Bruce Payette,PowerShell 的联合设计师

我在这里找到了。

我还在 MSDN 上发现了这个异常页面,指出这个限制是可配置的(但我没有找到任何关于如何执行此操作的信息) - 请参阅此处的备注部分。

如何设置此限制?

4

1 回答 1

4
  • PowerShell V1中,最大调用深度为 100:

使用.NET ReflectorSystem.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 回答