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

Exception 如何在PowerShell中配置调用深度?,exception,powershell,recursion,Exception,Powershell,Recursion,我只是在PowerShell中尝试了一些东西,但在一些测试递归函数中得到了一个关于调用深度设置为1000的错误。我在Internet上查找了一些信息,发现这是由于PowerShell中的错误处理造成的(如果我没有弄错的话): 递归深度限制在版本1中是固定的。由于处理异常的方式,深度递归在64位模式下导致了问题。它导致了级联内存不足错误。最终的结果是,我们硬限制了所有平台上的递归深度,以帮助确保脚本可移植到所有平台。 -Bruce Payette,PowerShell的联合设计师 我找到了 此外,

我只是在PowerShell中尝试了一些东西,但在一些测试递归函数中得到了一个关于调用深度设置为1000的错误。我在Internet上查找了一些信息,发现这是由于PowerShell中的错误处理造成的(如果我没有弄错的话):

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

我找到了

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

如何设置此限制?

  • 在PowerShell V1中,最大呼叫深度为100:
使用,我们可以从
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)中,似乎没有最大的调用深度(当然,除非资源耗尽)。此行为已在connect上进行过,因此在最终版本中可能会发生更改

干得不错。这就意味着文件中有错误,对吗?还是我弄错了?@jumbo是的,这是一个文档错误,除非我弄错了。:-)我更新了关于V3的信息,并引用了Roman Kuzmin在connect上提交的一个bug。