递归PowerShell函数中的调用深度溢出,是否有解决方法?
我用PowerShell编写了一个脚本,用于检查InternetExplorer是否正在运行,如果没有运行,则运行一个在中启动它的快捷方式。 以下是脚本:递归PowerShell函数中的调用深度溢出,是否有解决方法?,powershell,Powershell,我用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'
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循环就足够了,而且在内存上更容易使用。