强制杀死PowerShell时内存泄漏,有什么更好的方法

问题描述 投票:0回答:1

我是一名自学成才的程序员,我正在制作一个使用 powershell 创建快捷方式的 python 脚本。我利用了这样一个事实:如果网络路径不可用,则创建快捷方式将需要很长时间。如果进程花费太长时间,我会强制终止该进程,这会导致出现一堆可用计算机的快捷方式。这是循环内的内容

temp = "powershell; $WshShell = New-Object -ComObject WScript.Shell; $Shortcut = $WshShell.CreateShortcut(\"\"\"%cd%\\" + list[i][:list[i].find("\\")] + ".lnk\"\"\"); $Shortcut.TargetPath = \"\"\"\\" + list[i][list[i].find("\\"):-1] + "\"\"\"; $Shortcut.Save()"
subprocess.Popen(temp, shell=True)

这会贯穿一个类似于“COMPUTER1/在此处插入 ip ”的列表

然后我有另一个脚本,它使用任务列表来查找 powershell 进程并在大约 2 秒后杀死它们。这可行,但会导致内存泄漏。我认为这是杀死 powershell 的结果,并且资源没有从 RAM 中释放。

有没有办法释放内存或者有更好的方法来实现相同的目标?

python powershell memory-leaks kill-process
1个回答
0
投票

如果您在循环中运行它,那么是的..您一定会遇到内存问题,因为您不断创建 COM 对象,但从未从内存中释放它们。

Shortcut.Save()
之后,您需要确保 Windows 垃圾收集器将使用以下方法从内存中删除它们:

$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($shortcut)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($WshShell)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

顺便说一句将所有代码写在一长行中不仅丑陋,而且也无助于发现您可能在其中放入的任何错误。最好在多行中编写代码并进行适当的缩进。

© www.soinside.com 2019 - 2024. All rights reserved.