如何在PowerShell中配置调用深度?

时间:2012-05-25 13:57:35

标签: exception powershell recursion

我只是在PowerShell中尝试了一些事情并且在某些测试递归函数中出现了关于调用深度被设置为1000的错误。我在互联网上查找了一些信息,发现这是由于PowerShell中的错误处理(如果我做对了):

  

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

我发现它here

此外,我在MSDN上发现此异常页面指出此限制是可配置的(但我没有找到有关如何执行此操作的任何内容) - 请参阅备注部分here

如何设置此限制?

1 个答案:

答案 0 :(得分: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)中,似乎没有最大调用深度(当然,除非资源耗尽)。此行为在连接时已described as a bug,因此最终版本可能会更改。