递归PowerShell函数中的调用深度溢出,是否有解决方法?

递归PowerShell函数中的调用深度溢出,是否有解决方法?,powershell,Powershell,我用PowerShell编写了一个脚本,用于检查InternetExplorer是否正在运行,如果没有运行,则运行一个在中启动它的快捷方式。 以下是脚本: Invoke-Item 'C:\Users\User\Links\iexplorekiosk.lnk' Function Processchecker { $ProcessIE = Get-Process iexplore -ErrorAction SilentlyContinue if (!$ProcessIE) {

我用PowerShell编写了一个脚本,用于检查InternetExplorer是否正在运行,如果没有运行,则运行一个在中启动它的快捷方式。 以下是脚本:

Invoke-Item 'C:\Users\User\Links\iexplorekiosk.lnk'
Function Processchecker {
    $ProcessIE = Get-Process iexplore -ErrorAction SilentlyContinue
    if (!$ProcessIE) {
        Invoke-Item 'C:\Users\User\Links\iexplorekiosk.lnk'
    }
    Processchecker
}
Processchecker
虽然当我运行这个时,我得到了一个“调用深度溢出”错误,我相信这意味着它在函数中运行一个函数并旋转,我相信PowerShell中的最大值是10


有解决办法吗?因为我看不到它。

您从
if
块调用
ProcessChecker
,因此无论进程是否找到,每次都将递归一个级别

一个直接的解决方法是向
if
子句添加递归调用,如下所示:

Invoke-Item 'C:\Program Files\Internet Explorer\iexplore.exe'

Function Processchecker {
    $ProcessIE = Get-Process iexplore -ErrorAction SilentlyContinue
    if (!$ProcessIE) {
        Invoke-Item 'C:\Program Files\Internet Explorer\iexplore.exe'

        Processchecker
    }
}

Processchecker


+1递归的一个关键元素是终止条件,否则调用将递归,直到堆栈空间用完,或者在PowerShell的情况下,达到递归限制。将对Processchecker的调用移动到if语句中会创建终止条件,即当$ProcessIE不为null时,递归将终止。不过,在这种情况下,while循环就足够了,而且在内存上更容易使用。